# 题目: 给定整数n,给出最少可以用几个完全平方数的和得到n, 完全平方数指由整数的平方组成的数,比如1,4,9
# 思路: 借鉴数论中的四平方和定理(任意一个正整数均可以表示为4个以内完全平方数的和),这个定理告诉我们,返回结果只可能为1,2,3或4
另外两个可以简化搜索空间的方法: 如果一个数含有因子4,那么,把这个数除以4,并不影响结果(4*任意正整数都是完全平方数)
如果一个数除以8余7的话,那么肯定由4个完全平方数组成(证明如下)
剩下的结果因为缩小了搜索空间,直接枚举就可以了
class Solution { public: int numSquares(int n) { while (n % 4 == 0) n /= 4; if (n % 8 == 7) return 4; for (int a = 0; a * a <= n; ++a) { int b = sqrt(n - a * a); if (a * a + b * b == n) { return !!a + !!b; } } return 3; } };
证明:n=(8k+7)4^m(k,m 为非负整数)不能表示为三个平方数之和。
例如,当 k=0 ,m=0 时,n=(8×0+7)4^0=7 ,7 不能表示为三个平方数之和。
当 k=1 ,m=0 时,n=(8×1+7)4^0=15 ,15 不能表示为三个平方数之和。
当 k=0 ,m=1 时,n=(8×0+7)4^1=28 ,28 不能表示为三个平方数之和。
【证】先证明 n=8k+7 不能表示为 a^2+b^2+c^2(a,b,c 为整数)形式。
因为 n=8k+7 是奇数,所以,a,b,c 或者都是奇数,或者是一奇数两偶数。
因为奇数平方必定是 8 的倍数加 1 ,三个奇数平方和必定是 8k+3 形式,不可能是 8k+7 。
又因为偶数平方必定是 4 的倍数,一奇数两偶数平方之和,只能是 8k+1 或 8k+5 形式,也
不可能是 8k+7 。可见,任何一种情况,三个平方数之和都不可能是 n=8k+7 。
下面用数学归纳法证明:n=(8k+7)4^m 不能表示为 a^2+b^2+c^2(a,b,c 为整数)形式。
(1)当 m=0 时,n=8k+7 ,上面已经证明它不能表示为 a^2+b^2+c^2 形式。
(2)设已知对某个非负整数 m ,命题成立,(8k+7)4^m 不能表示为 a^2+b^2+c^2 形式。
下面看 m+1 时的情形:
假设有 (8k+7)4^(m+1)=a^2+b^2+c^2 ,显然它是 4 的倍数。这时 a,b,c 不可能都是奇数,也不可能是一奇数两偶数,也不可能是两奇数一偶数
(因为两奇数一偶数的平方和是4k+2 形式,不是 4 的倍数),只可能三个都是偶数。
设 a=2a',b=2b',c=2c'(a',b',c' 为整数),则有
(8k+7)4^(m+1)=(2a')^2+(2b')^2+(2c')^2=4(a')^2+4(b')^2+4(c')^2 ,
等式两边同时约去 4 ,有
(8k+7)4^m=(a')^2+(b')^2+(c')^2 。
与已知 (8k+7)4^m 不能表示为 a^2+b^2+c^2 形式发生矛盾,所以假设不成立,当 m+1 时
(8k+7)4^(m+1) 也不能表示为 a^2+b^2+c^2 形式。
(3)所以,对任何非负整数 m ,(8k+7)4^m 都不能表示为 a^2+b^2+c^2 形式。