题目描述:
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 示例 1: 输入: n = 12 输出: 3 解释: 12 = 4 + 4 + 4. 示例 2: 输入: n = 13 输出: 2 解释: 13 = 4 + 9.
解法一:利用数学方法(四平方定理)解决
参考:https://blog.csdn.net/qq_17550379/article/details/80875782
四平方定理:每个正整数均可表示为不超过4个整数的平方和 (组成的整数个数可为:1,2,3,4) 其一个重要推论: 满足四数平方和定理的正整数n,有n=4^a(8b+7)
1 int numSquares(int n) { 2 int i,j; 3 //满足四平方定理,返回4 4 while (n%4 == 0) 5 n /= 4; 6 if (n%8 == 7) 7 return 4; 8 9 //剩下的结果个数可为:1,2,3 10 //判断是否为1或2个数的平方和组成 11 for (i = 0 ; i*i <= n ; i ++) 12 { 13 j = sqrt(n-i*i); 14 if (i*i + j*j == n) 15 return !!i+!!j;//取反两次,得到的是个数 16 } 17 18 //剩余情况为3个 19 return 3; 20 }