试把一个正整数n拆分为若干个(不少于2个)连续正整数之和。例如:n=15,有3种拆分:15=1+2+3+4+5,15=4+5+6,15=7+8。 对于给定的正整数n,求出所有符合这种拆分要求的连续正整数序列的个数。
思路:
定义变量s实施连续项求和,设计i(1(n-1)/2)循环为连续项求和的起始项,j(i(n+1)/2循环作为连续求和的累加项。
在j循环中每加一项j后检测是否出现s>=n。若未出现,所求连续项之和s不足n,则继续往后求和。若出现s>=n,所求连续整数之和s已达到或超过n,即退出求和j循环。但在退出循环之前有必要进一步检测s=n是否成立,若有s=n,即找到一个解,应用变量c统计解的个数并出输出一个序列。
流程图:
代码:
#include<time.h>#include<stdio.h>int main() {double op,ed;double time;op=clock();long c,i,j,n,s;printf("请输入拆分数n:");scanf("%ld",&n);c=0;for(i=1; i<=(n-1)/2; i++) {s=0;for(j=i; j<=(n+1)/2; j++) {s=s+j;if(s>=n) {if(s==n) {c++;printf(" %d: %d+···+%d\n",c,i,j);}break;}}}printf("共有以上%d个解。\n",c);ed=clock();time=ed-op;printf("\n");printf("time=%lfms\n",time);return 0;}
流程图:
代码:
#include<time.h>#include<math.h>#include<stdio.h>int main() {double op,ed;double time;op=clock();long c,k,m,n,t;printf("请输入拆分数n:");scanf("%ld",&n);t=(long)sqrt(2*n);c=0;for(k=2; k<=t; k++) {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);}printf("共有以上%d个解。\n",c);ed=clock();time=ed-op;printf("\n");printf("time=%lfms\n",time);return 0;}
结果:
枚举求解:试把一个正整数n拆分为若干个(不少于2个)连续正整数之和。例如:n=15 有3种拆分:15=1+2+3+4+5 15=4+5+6 15=7+8。 对于给定的正整数n 求出所有符合这种拆分要求
如果觉得《枚举求解:试把一个正整数n拆分为若干个(不少于2个)连续正整数之和。例如:n=15 有》对你有帮助,请点赞、收藏,并留下你的观点哦!