为什么这样就可以不超时

P1035 [NOIP2002 普及组] 级数求和

ottas @ 2021-11-12 15:36:21

我原来的

#include <stdio.h>
int main()
{int n=1,k;
double s=0;
scanf("%d",&k);
for(;;n++)
{
    s+=1/n;
    if(s>k)break;
}
printf("%d",n);
}

参照一些帖子里的方法改的

#include <stdio.h>
int main()
{int n=1,k;
double s=0.0;
scanf("%d",&k);
for(;;n++)
{
    s+=1.0/n;
    if(s>k*1.0)break;
}
printf("%d",n);
}

谢谢


by Loser_King @ 2021-11-12 15:41:25

1/n 是整除,当 n>1 的时候其值为 0,导致后面 s 的值不改变,不能退出循环,所以就 TLE 了

而 1.0/n 是实数除法,返回的是小于 1 的小数,使 s 增加超过 k,从而 break 不会超时


by Loser_King @ 2021-11-12 15:42:32

以后可以试试使用输出调试,比如循环中输出 s 就可以避免这个问题。


by ottas @ 2021-11-12 19:13:44

@Loser_King 懂了懂了,谢谢


|