把一个给定的数N写成连续的若干个数之和的形式,若可以输出连续整数中的第一个数字。
一开始随手枚举,直接TE。思考优化,然后想到用等比数列。
对于给定的N,以1为开头则最多有k个数字,而k>=2且小于等于sqrt(2*N)(由等差数列求和公式有k(k+1)=2N)
a1*k+(1+...+k-1)=N即a1*k+(k)(k-1)/2=N即若(N-(k)(k-1)/2)%k=0即可说明存在,再将a1输出
#include<stdio.h>
int main()
{
int i,sum,flag=0,t;
scanf("%d",&sum);
for (i=sqrt(sum*2-0.5);i>=2;i--)
{
if((sum-i*(i-1)/2)%i==0) {printf("%d\n",(sum-i*(i-1)/2)/i);flag=1;}
}
if (flag==0) printf("No Solution\n");
}