算法优化

试把一个正整数n拆分为若干个(不少于2个)连续正整数之和。例如,n=15,有3种拆分
15 = 1+2+3+4+5
15 = 4+5+6
15 = 7+8
求解的个数,并输出解。

优化思路如下

  1. 设给定整数为n,满足拆分的最大项数,则必须从1开始即:
  2. 利用求和公式优化数字n的拆分_算法优化

  3. 这样我们就可以看见这个取值范围被缩小到
  4. 利用求和公式优化数字n的拆分_#include_02

  5. 设起始项为m的连续k项之和为给定正整数n,由求和公式可得:
  6. 利用求和公式优化数字n的拆分_算法_03

  7. (m+k-1)就是为了保证有k项数之和,因为最前面的m可以写成:(m+0)
  8. 由上式解的m可得:
  9. 利用求和公式优化数字n的拆分_算法_04

  10. 为了保证第k项的m为整数,那么2n/k要必须是整数,或者(2n/k+1)/2必须是整数,才满足条件,此时的一个正确拆分的解法为:
  11. 利用求和公式优化数字n的拆分_#include_05

  12. 代码描述:
#include <stdio.h>
#include <math.h>
int main() {
int k,n=15,m,c=0;
int t=(int)sqrt(2*n);//枚举的取值边界
for(k=2;k<=t;k++){//至少是连续2项起
if((2*n)%k>0||(2*n/k+1-k)%2>0){//只要这两个任意得不到整数,也就是有余数,那么结果就认定不是整数
continue;
}
m = (2*n/k+1-k)/2;
c++;
printf("%d:%d+……+%d\n",c,m,m+k-1);
}
return 0;
}