public class 排列硬币三种解法 {
public static void main(String[] args) {
System.out.println(arrangeCoins(10));
System.out.println(arrangeCoins2(10));
System.out.println(arrangeCoins3(10));
}
// 解法一 迭代
public static int arrangeCoins(int n) {
for (int i = 1; i <= n; i++) {
n = n - i;
if (n <= 1) {
return i;
}
}
return 0;
}
// 解法二 二分法
public static int arrangeCoins2(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 high;
}
// 解法三 牛顿迭代
public static int arrangeCoins3(int n) {
if (n == 0) {
return 0;
}
return (int)sqrt(n, n);
}
private static double sqrt ( double x, int n){
double res=(x+(2*n-x)/x)/2;
if(res==x){
return x;
}else{
return sqrt(res,n);
}
}
}