题目链接
牛顿迭代公式:

class Solution {public int arrangeCoins(int n) {// return arrangeCoins1(n);return arrangeCoins2(n);// return arrangeCoins3(n);}// 1.迭代public int arrangeCoins1(int n) {int num = 1;while(num <= n) {n = n - num;num ++;}if(num == n) return n;return num-1;}// 2.二分查找(因为不满足的行数一定是小于n的,所以。。), 前x项和为:(1+x)*(x/2)public int arrangeCoins2(int n) { // int类型的范围int left = 1,right = n;while(left <= right) {int mid = (right - left)/2 + left;long num = (long)(mid+1)*mid;if(num == (long)2*n) {return mid;} else if(num > (long)2*n) {right = mid - 1;} else {left = mid + 1;}}return left-1;}// 3.牛顿迭代, 1804289383过不去,会发生栈溢出public int arrangeCoins3(int n) {if(n == 0) return 0;return (int)sqrt(n,n);}private double sqrt(double x, int n) {double res = (x + (2*n - x)/x)/2;if(res == x) {return res;} else {return sqrt(res,n);}}}
