历年编程竞赛真题

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

先说数学:

设置:

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

a1=a

an=a+n-1

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

回到这个程序:

我们的输入数据实际上是sn,所以我们需要找到N个从A开始的连续递增的序列,以使总和为sn。

在这里,我们可以通过周期来判断。给定一个已知的n和sn,我们可以求出a;如果a是正整数,我们可以求出等差数列的第一项;如果给定n,d=1,我们可以写出这个和。

代码如下:

# include & ltstdio.h & gt

作废?主()

{

int?输入,I,n,flag

浮动?a;//等差数列的第一项不一定是整数。

flag = 0;

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

scanf("%d ",& amp输入);

for(n = 2;n & lt=输入;n++)

{

a =(2 *输入+n-n * n)/(2.0 * n);//搜索的第一项

if(int(a)= = a & amp;& ampa & gt0)//如果是整数,则符合要求。

{

printf("%d=%d ",input,int(a));//输出序列是整数,A本质上是整数,所以强制转换的类型不影响结果。

for(I = 1;我& lt= n-1;i++)

printf("+%d ",int(a+I));//等差数列的其他项也是整数,a+i本质上是一个整数,是加载卸载的类型。

printf(" \ n ");

flag++;//flag记录符合要求的级数。

}

}

if(flag==0)?//标志最初为0。通过上面的循环,有满意的存在就不是0。如果是0,说明不能写成等差数列。

Printf("%d "不能表示为n个连续正整数之和\n ",input);

}