题目:
不用开方,判断一个自然数是否是某个数的平方。
分析:
一个数N,二进制形式有n位,N一定小于2^(n+1),所以根号N一定小于2^((n+1)/2),所以N除以2^((n+1)/2)一定小于根号N。
代码:
#include <iostream>
#include <math.h>
using namespace std;
bool isPowered(int num)
{
int tempnum = num;
int bitCount = 0;
do
{
tempnum >>= 1;
++bitCount;
} while (tempnum != 0);
for (int i = num >> ((bitCount+1) / 2); true; ++i)
{
int powi = i * i;
if (powi == num)
{
return true;
}else if (powi > num)
{
return false;
}
}
}
void main()
{
cout << isPowered(10) << " " << sqrtf(10) << endl;
cout << isPowered(100) << " " << sqrtf(100) << endl;
cout << isPowered(1000) << " " << sqrtf(1000) << endl;
cout << isPowered(10000) << " " << sqrtf(10000) << endl;
cout << isPowered(100000) << " " << sqrtf(100000) << endl;
cout << isPowered(1000000) << " " << sqrtf(1000000) << endl;
cout << isPowered(1000001) << " " << sqrtf(1000001) << endl;
cout << isPowered(1000000000) << " " << sqrtf(1000000000) << endl;
cout << isPowered(31111 * 31111) << " " << sqrtf(31111 * 31111) << endl;
}
一个小小的想法,代码方面应该还可以优化。