[LeetCode] Perfect Squares 完全平方数

# 题目: 给定整数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^077 不能表示为三个平方数之和。
      当 k=1 ,m=0 时,n=(8×1+7)4^01515 不能表示为三个平方数之和。     
      当 k=0 ,m=1 时,n=(8×0+7)4^12828 不能表示为三个平方数之和。
【证】先证明 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 形式。

猜你喜欢

转载自www.cnblogs.com/jodio/p/10573007.html