关于编程大赛的一道题目,一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,找出这样的数并输出!

题目描述:一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:15=1+2+3+4+515=4+5+615=7+8请编写程序,根据输入的任何一个正整数,找出符... 题目描述:一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8
请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
例如:输入15,则输出
15=1+2+3+4+5
15=4+5+6
15=7+8
若不符合则输出提示信息!
要求要用C语言实现,因为本人目前只能看懂C语言!
展开
幽兰书生823
2012-06-01 · TA获得超过1048个赞
知道小有建树答主
回答量:301
采纳率:100%
帮助的人:258万
展开全部

这个问题看起来不是很简单,需要设计一个算法:

先讲数学:

设:

an=a+(n-1)*d (这里d=1)

a1=a

an=a+n-1

sn=(a1+an)n/2=(2a-1+n)/2

再回到这个编程上来:

我们的输入数据其实就是sn,需要找到以a开始的n个连续的递增数列使得和为sn。

这里我们可以用循环来判定,给定一个n,sn已知,就可以求出a,如果a为正整数那么就可以找到等差数列的首项,加上n给定,d=1,那么就可以写出这个和式子。

代码如下:

#include<stdio.h>

void main()

{

int input,i,n,flag;

float a;//等差数列的首项不一定为整数

flag=0;

printf("输入判断的整数:\n");

scanf("%d",&input);

for(n=2;n<=input;n++)

{

a=(2*input+n-n*n)/(2.0*n);//求的首项

if(int(a)==a&&a>0)//如果为整整数,则满足要求

{

printf("%d=%d",input,int(a));//输出的序列为整数,a实质是整数,那么强制转化类型不影响结果

for(i=1;i<=n-1;i++)

printf("+%d",int(a+i));//等差数列的其他项也为整数,a+i实质是整数,装换类型

printf("\n");

flag++;//flag记录满足要求的数列数

}

}

if(flag==0)   //flag初始为0,通过上面的循环,如果有满足的在则不为0,为0则说明不能写成等差数列

printf("%d不能被表示成n连续正整数之和\n",input);

}

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式