
代码实现:
/**
* 硬币排列
*/
public class ConArrange {
public static void main(String[] args) {
System.out.println("直接循环: "+binSearch(16));
System.out.println("二分树查找方法: "+arrangeCoins(16));
System.out.println("牛顿迭代: "+arrangeCoins2(16));
}
//直接循环
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 binSearch(int n){
int low = 0,high = n;
while (low <= high){
int mid = (low + high) / 2;
int cost = ((mid + 1) * mid) / 2; //1+2+3+...+x = n 等于 x平方+x = 2n
if(cost == n){
return mid;
}else if (cost > n){
high = mid - 1;
}else {
low = mid + 1;
}
}
//找不到就返回他上一级
return high;
}
//牛顿迭代: x = (2n-x)开方-->(x + (2*n - x)/x)/2
public static int arrangeCoins2(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);
}
}
}