历年编程竞赛真题
这个问题看起来不是很简单,所以我们需要设计一个算法:
先说数学:
设置:
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);
}