这个问题看起来不是很简单,需要设计一个算法:
先讲数学:
设:
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=2n<=inputn++)
{
a=(2*input+n-n*n)/(2.0*n)//求的首项
if(int(a)==a&&a>0)//如果为整整数,则满足要求
{
printf("%d=%d",input,int(a))//输出的序列为整数,a实质是整数,那么强制转化类型不影响结果
for(i=1i<=n-1i++)
printf("+%d",int(a+i))//等差数列的其他项也为整数,a+i实质是整数,装换类型
printf("\n")
flag++//flag记录满足要求的数列数
}
}
if(flag==0) //flag初始为0,通过上面的循环,如果有满足的在则不为0,为0则说明不能写成等差数列
printf("%d不能被表示成n连续正整数之和\n",input)
}
var a,k:array[0..1000000]of longintb,c,d,e,f,g,h,i,j,l,n,m,mid:longint
begin
assign(input,'count.in')
assign(output,'count.out')
reset(input)
rewrite(output)
read(b,f)
e:=0
n:=0
l:=1
for c:=1 to b do
begin
read(d)
k[d]:=k[d]+1
end
while l<=b do
begin
for m:=1 to k[n] do
begin
a[l]:=n
l:=l+1
end
n:=n+1
end
e:=0
for c:=1 to b do
begin
i:=c+1
j:=b
while (j>=i) do
begin
mid:=(j+i) div 2
if a[mid]+a[c]>f then j:=mid-1 else i:=mid+1
end
e:=e+(j-c)
end
writeln(e)
close(input)
close(output)
end.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)