心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0

对一个给定的自然数n,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为n。例子:1998+1999+2000+2001+2002 = 10000,所以从19982002的一个自然数段为n=10000的一个解。

 

这是一道水题,但是我却没有一次AC

只需要从0n/2-1中枚举区间端点,设一个区间端点为a,另一个区间端点为b,那么如果满足如下条件则为所求的一组解:a<b(a+b)(b-a+1)==2n,解得b= (sqrt(1-4a+4a^2+8n)-1)/2,对b进行检测,如果同时满足b为整数,即为一组解。

没有一次AC这道题的原因主要是因为数据类型的原因,一开始对na用了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>=0return (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)  编辑 收藏 引用 所属分类: 题目分类:数学/数论

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理