對一個給定的自然數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 閱讀(658)
評論(0) 編輯 收藏 引用 所屬分類:
題目分類:數學/數論