对一个给定的自然数n,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为n。例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为n=10000的一个解。
这是一道水题,但是我却没有一次AC!
只需要从0到n/2-1中枚举区间端点,设一个区间端点为a,另一个区间端点为b,那么如果满足如下条件则为所求的一组解:a<b且(a+b)(b-a+1)==2n,解得b= (sqrt(1-4a+4a^2+8n)-1)/2,对b进行检测,如果同时满足b为整数,即为一组解。
没有一次AC这道题的原因主要是因为数据类型的原因,一开始对n和a用了long,不仅有一个点过不去,还超时一个点!后来改成double,全部AC,全部数据用时0.4s。
这也是在提醒我要注意程序中的运算机制。
以下是我的代码:
#include<stdio.h>
#include<math.h>
double f(double n,double a)
{
double d=sqrt(1-4*a+4*a*a+8*n);
if(d>=0) return (d-1)/2;
return 0.1;
}
int main()
{
FILE *fin,*fout;
double n,i,tmp,sign;
fin=fopen("combo.in","r");
fscanf(fin,"%lf",&n);
fclose(fin);
// Read In
fout=fopen("combo.out","w");
for(i=0;i<n/2;i++)
{
tmp=f(n,i);
sign=tmp-(long)tmp;
if(sign==0&&tmp>i)
fprintf(fout,"%.0lf %.0lf\n",i,tmp);
}
fclose(fout);
return 0;
}
posted on 2010-01-06 20:26
lee1r 阅读(617)
评论(0) 编辑 收藏 引用 所属分类:
题目分类:数学/数论