1. 程式人生 > 其它 >排列硬幣

排列硬幣

總共有n枚硬幣,將它們擺成一個階梯形狀,第k行就必須正好有k枚硬幣。

給定一個數字n,找出可形成完整階梯行的總行數

n是一個非負整數,並且在32位有符號整型的範圍內

public class ArrangeCoin {
    public static void main(String[] args) {
        System.out.println(arrangeCoins(10));
    }
    //窮取,迭代
    public static int arrangeCoins(int n){
        for (int i=1;i<=n;i++){
            n=n-i;
            if (n<=i){
                return I;
            }
        }
        return 0;
    }
    //二分查詢
    public static int arrangeCoins1(int n){
        int low=0,high=n;
        while (low <= high){
            int mid =(high-low)/2+low;//行數
            int cost = ((mid+1)*mid)/2;//總共要消耗的硬幣數量
            if (cost == n){
                return mid;
            }else if(cost>n){
                high = mid-1;
            }else {
                low = mid +1;
            }
        }
        return 0;
    }
    //牛頓迭代
    public static int arrangeCoins2(int n){
        if(n==0){
            return 0;
        }
        return (int)sqrt(n,n);

    }
    public static double sqrt(double i,int x){
        double res = (i+(2*i-x)/i)/2;
        if (res == i){
            return I;
        }else{
            return sqrt(res,x);
        }

    }
}