1. 程式人生 > >藍橋杯之還款計算

藍橋杯之還款計算

標題: 還款計算

    銀行貸款的等額本息還款方法是:
    每月還固定的金額,在約定的期數內正好還完(最後一個月可能會有微小的零頭出入)。

    比如說小明在銀行貸款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); } } }