1. 程式人生 > >【計蒜客系列】挑戰難題17:x的平方根

【計蒜客系列】挑戰難題17:x的平方根

設計函式int sqrt(int x),計算x的平方根。

格式:
   輸入一個數x,輸出它的平方根。直到碰到結束符號為止。
   千萬注意:是int型別哦~
   輸入可以如下操作:
while(cin>>x)
或者
while(scanf("%d", &x) != EOF)


樣例1
輸入:
1
2
3
4
5
6
7
8
9
輸出:
1
1
1
2
2
2
2
2

3

二分法:

#include<stdio.h>
int sqrt(int x) {
	unsigned long long begin = 0;
	unsigned long long end = (x + 1) / 2;
	unsigned long long mid;
	unsigned long long tmp;
	while (begin < end) {
		mid = begin + (end - begin) / 2;
		tmp = mid * mid;
		if (tmp == x)
			return mid;
		else if (tmp < x)
			begin = mid + 1;
		else
			end = mid - 1;
	}
	tmp = end * end;
	if (tmp > x)
		return end - 1;
	else
		return end;
}
int main() {
	int x;
	int ans;
	while (scanf("%d", &x) != EOF) {
		ans = sqrt(x);
		printf("%d\n", ans);
	}
}

牛頓迭代法

牛的迭代法可以解決問題,但是執行時間超時,AC不過。
int sqrt2(int a) {//牛頓迭代法

	if(a < 0.00001)
		return 0;
	float x = a / 2;
	float t = a ;
	while(abs(x - t) > 0.00001)
	{
		t = x;
		x = (x + a/x)/2;
	}
	return (int)x;
}