首页 > 试题广场 >

(金融风暴)银行会互相借钱。在经济艰难时期,如果一个银行倒闭

[问答题]
(金融风暴)银行会互相借钱。在经济艰难时期,如果一个银行倒闭,它就不能偿还贷款。一个 银行的总资产是它当前的余款减去它欠其他银行的贷款。图 8 - 8 就是五个银行的状况图。每个 银行的当前余额分别是 2500 万美元、1 亿 2500万美元、1 亿 7500 万美元、7500 万美元和 1 亿 8100 万美元。从节点 1 到节点 2 的方向的边表示银行 1 借给银行 2 共计 4 千万美元。

如果银行的总资产在某个限定范围以下,那么这个银行就是不安全的。它借的钱就不能返 还给借贷方,而且这个借贷方也不能将这个贷款算人它的总资产。因此,如果借贷方总资产在 限定范围以下,那么它也不安全。编写程序,找出所有不安全的银行。程序如下读取输入。它 首先读取两个整数 n 和 limit, 这里的 ri 表示银行个数,而 limit 表示要保持银行安全的最小 总资产。然后,程序会读取描述 n 个银行的 n 行信息,银行的 id 从 0 到 n - 1。每一行的第一个 数字都是银行的余额,第二个数字表明从该银行借款的银行,其余的就都是两个数字构成的数 对。每对都描述一个借款方。每一对数字的第一个数就是借款方的 id, 第二个数就是所借的钱 数。例如,在图 8 - 8 中五个银行的输人如下所示(注意:limit 是 201 ):

# 金融风暴
import numpy as np
# 输入n个银行和其对应的资产最低额
n, limit = list(map(int, input().split()))
# 初始化借款矩阵
borrow = np.zeros((5, 5))
# 银行的余额
paint = []
# 遍历每一行数据
for i in range(n):
    # 注意数据类型的转换
    num = list(map(float, input().split()))
    # 将余额放入列表中
    paint.append(num[0])
    # 将对应的借款数赋值给borrow矩阵,注意步长为2
    for j in range(2, len(num) - 1, 2):
        borrow[i][int(num[j])] = num[j + 1]

unsafe = []
k = 1
# 最多遍历5次
while(k <= 5):
    for i in range(n):
        curr = paint[i] + np.sum(borrow[i, :])
        if curr < limit:
            # 避免多次记录重复值
            if i not in unsafe:
                unsafe.append(i)
            # 将不良银行的那一列全部置为0
            borrow[:, i] = [0] * 5
    k += 1
# 翻转数组
unsafe.sort(reverse = False)
unsafe, borrow

发表于 2022-04-12 10:04:33 回复(0)
// 金融风暴

import java.util.Scanner;

public class Financial {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("输入银行的个数和要保持银行安全的最小总资产(整数): ");
		int bank = sc.nextInt();
		int limit  = sc.nextInt();
		System.out.println();
		double[][] borrowers = new double[bank][bank]; // 创建一个二维数组,double[i][j]表示i银行贷款给j银行的额度
		double[] balance = new double[bank]; // 创建一个一维数组,double[i]表示i银行的余额
		bankInput(borrowers, balance, bank); // 输入银行的基本信息
		bankResult(borrowers, balance, bank, limit); // 输出银行安不安全如果不安全输出它的编号
	}
	public static void bankInput(double[][] borrowers, double[] balance, int bank) { // 输入银行的基本信息
		Scanner sc = new Scanner(System.in);
		for (int i = 0; i < bank; i++) {
			System.out.println("输入银行" + i + "的余额和从该银行借款的银行个数");
			System.out.print("和借款银行的编号和借款数额: ");
			balance[i] = sc.nextDouble();
			int num = sc.nextInt();
			for (int j = 0; j < num; j++) {
				int k = sc.nextInt();
				borrowers[i][k] = sc.nextDouble();
			}
			System.out.println();
		}
	}
	public static void bankResult(double[][] borrowers, double[] balance, int bank, int limit) { // 输出银行安不安全如果不安全输出它的编号
		int[] result = new int[bank * (bank + 1) / 2 + bank]; // 创建一个一维数组用来储存所有的不安全银行编号(可重复)
		int num2 = 0;
		int num1 = 0;
		int num3;
		do {  // 将所有不安全的银行编号储存进result
			num3 = num1;
			num1 = 0;
			for (int i = 0; i < bank; i++) {
				double totalLoan = 0;
				for (int j = 0; j < bank; j++) {
				totalLoan += borrowers[i][j];
				}
				double totalAssets = totalLoan + balance[i];
				if (totalAssets < limit) {
					num2++;
					num1++;
					result[num2 - 1] = i; // 将所有不安全的银行编号储存进result
					for (int k = 0; k < bank; k++) {
						borrowers[k][i] = 0;
					}	
				}	
			}
		}
		while (num1 != num3); // 不安全银行不再增加时结束循环
		if (num2 == 0) {
			System.out.println("没有不安全的银行");
		}
		else {
			UnsafeBank(result, num2); // 将result里面的不重复元素输出即不安全银行的编号
		}
	}
	public static void UnsafeBank(int[] result, int num2) { // 将result里面的不重复元素输出即不安全银行的编号
		int [] j = new int [num2];
		int num;
		int d = 0;
		int i = 0;
		while (i < num2) {
			boolean c = true; // 赋值变量c为true
			num = result[i];
			for (int b = 1; b < d + 1; b++) {
				if (num == j[b - 1]) { // 后面的数字和前面的比较如果相同赋值变量c为false
					c = false;
					break;
				}
			}
			if (c) { // 如果变量c为true,d加1且将num赋值给j[d - 1]
				d++;
				j[d - 1] = num;
			}
			i++;
		}
		int [] e = new int [d]; // a创建一个新的大小为d的数组
		System.arraycopy(j, 0, e, 0, e.length); // 数组e从0项开始复制数组f从0项开始的元素,元素个数为e.length
		System.out.print("不安全的银行是: ");
		for (int f = 0; f < e.length; f++) {
			System.out.print(e[f] + " "); // 输出数组e的所有元素
		}
	}
}

发表于 2020-03-03 15:49:20 回复(0)