试题 算法训练 连续正整数的和
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
78这个数可以表示为连续正整数的和,1+2+3,18+19+20+21,25+26+27。
输入一个正整数 n(<=10000)
输出 m 行(n有m种表示法),每行是两个正整数a,b,表示a+(a+1)+…+b=n。
对于多种表示法,a小的方案先输出。
样例输入
78
样例输出
1 12
18 21
25 27
代码
#include<stdio.h>
int main()
{
int n,i,sum=0,k=0,x,y;
scanf("%d",&n);
for(i=1;i<n;i++){
sum+=i;
k++;//k代表项数
if(sum==n){//遇到相等就输出
x=(sum*2/k+1-k)/2;//因为是连续的正整数所以用求和公式求出首项和末项
y=x+k-1;
printf("%d %d\n",x,y);
i=x;//初始化i,因为该循环结束后for循环要执行一次i++所以i=x而不是i=x+1
sum=0;//初始化sum
k=0;//初始化k
}
else if(sum>n){//sum大于n同理初始化i,sum,k
i=i-k+1;
sum=0;
k=0;
}
}
return 0;
}