一个数可以拆成至少几个数的平方数
这题有一个定理是四平方和定理 意思是每个数一定可以拆成4个整数的平方和
而当一个数可以被拆成四个非零整数的平方和时,一定会满足n=4^a*(8b+7)
所以思路为:
1 若这个数满足n=4^a*(8b+7)
那就返回4
2 否则 如果这个数正好是一个数的平方 那就返回1
3 否则 如果这个数是两个数的平方 那就枚举其中一个数 看另外一个数是不是完全平方数 如果有满足的 返回2
4 否则 返回3
代码如下
bool judge(int n)
{
return (int(sqrt(n))*int(sqrt(n))) == n;
}
int numSquares(int n) {
int tmp = n;
while (tmp % 4 == 0) tmp /= 4;
if (tmp % 8 == 7) return 4;
if (judge(n)) return 1;
for (int i = 1; i*i < n; i++)
{
if (judge(n - i * i)) return 2;
}
return 3;
}