总共有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);
}
}
}