藍橋杯之還款計算
阿新 • • 發佈:2019-01-25
標題: 還款計算
銀行貸款的等額本息還款方法是: 每月還固定的金額,在約定的期數內正好還完(最後一個月可能會有微小的零頭出入)。 比如說小明在銀行貸款1萬元。貸款年化利率為5%,貸款期限為24個月。 則銀行會在每個月進行結算: 結算方法是:計算本金在本月產生的利息: 本金 x (年利率/12) 則本月本金結餘為:本金 + 利息 - 每月固定還款額 計算結果會四捨五入到“分”。 經計算,此種情況下,固定還款額應為:438.71 這樣,第一月結算時的本金餘額是: 9602.96 第二個月結算: 9204.26 第三個月結算: 8803.9 .... 最後一個月如果仍按固定額還款,則最後仍有0.11元的本金餘額, 但如果調整固定還款額為438.72, 則最後一個月會多還了銀行0.14元。 銀行會選擇最後本金結算絕對值最小的情況來設定 每月的固定還款額度。 如果有兩種情況最後本金絕對值相同,則選擇還款較少的那個方案。 本題的任務是已知年化利率,還款期數,求每月的固定還款額度。 假設小明貸款為1萬元,即:初始本金=1萬元。 年化利率的單位是百分之多少。 期數的單位為多少個月。 輸入為2行, 第一行為一個小數r,表示年率是百分之幾。(0<r<30) 第二行為一個整數n,表示還款期限。 (6<=n<=120) 要求輸出為一個整數,表示每月還款額(單位是:分) 例如: 輸入: 4.01 24 程式應該輸出: 43429 再比如: 輸入: 6.85 36 程式應該輸出: 30809 資源約定: 峰值記憶體消耗(含虛擬機器) < 256M CPU消耗 < 1000ms 請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。 所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。 java選手注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。 java選手注意:主類的名字必須是:Main,否則按無效程式碼處理。
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;
public class Main {
private static int n;
private static double r;
static int a = 0;
static double a2 = 0;
public static double f(double N, int k, int x){
if(N > 0 && k == n){
return N;
}else if(N < 0 && k == n){
if(a == 0){
a = x;
a2 = Math.abs(N);
}
return N;
}
N = N + N * r - x;
BigDecimal dd = BigDecimal.valueOf(N);
f(dd.setScale(0 , RoundingMode.HALF_UP).doubleValue(), k + 1, x);
return 0;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
r = sc.nextDouble(); //表示的是年利率
n = sc.nextInt(); //表示要還款多少個月
sc.close();
// r = r / n;
r = r / 100;
//初步鎖定一個大概範圍, 這個範圍可以縮小試探的次數
int max = (int)((n / 12 * r * 1000000 + 1000000) / n);
int min = (int)((r * 1000000 + 1000000) / n);
r = r / 12; //月利率
//System.out.println("區間【" + max + ", " + min + " 】");
for(int i = min; i < max; i++){
f(1000000, 0, i);
}
double abs = 1000000;
for(int i = n; i >= 1; i--){
abs = abs + abs * r - (a - 1);
BigDecimal dd = BigDecimal.valueOf(abs);
abs = dd.setScale(0, RoundingMode.HALF_UP).doubleValue();
}
//System.out.println(abs + ", " + a2);
if(a2 - abs >= 0){
System.out.println(a - 1);
}else{
System.out.println(a);
}
}
}