大佬们求助,

P1035 [NOIP2002 普及组] 级数求和

AnGel_Fox @ 2024-12-10 12:16:27

孩子80,最后一个测试点过不去,输入为1,然后代码输出也是1

#include <stdio.h>
#include <stdlib.h>

int main()
{
    double n;
    scanf("%f",&n);
    double s=1,k=2;
    while(s<=n)
        {
            s=s+1/k;
            k=k+1;
        }
        printf("%d",(int)k-1);
    return 0;
}

by computer11 @ 2024-12-10 12:56:46

循环中的代码顺序有点错了,改了一下:

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

by programmer330 @ 2024-12-10 12:58:51

@AnGel_Fox

输入 1 不应该输出 2


by AnGel_Fox @ 2024-12-11 21:33:50

@computer11好的,谢谢大佬awa,但是还是可以讲解一下吗,具体错哪还是没看懂


by AnGel_Fox @ 2024-12-11 21:35:45

@programmer330我的意思是我的代码输出是一,但是答案是2,讲得有点歧义,抱歉


by computer11 @ 2024-12-15 19:29:15

@AnGel_Fox 这种题中尽量不要提前准备好第一项,让第一项也和其他项一起算会比较好,就不会有什么例外了。


by computer11 @ 2024-12-15 19:36:09

@AnGel_Fox 你是

double s=1,k=2;

s=s+1/k;
k=k+1;

这是准备好第一项,先加后移的写法, 但我是

double s=0,k=0;
k++;
s+=1/k;

并且

if(s>n) break;

是将第一项混入了杂群中,并且先移后加,可以避免出现如 k-1 一般的误差。 在不确定退出的时机的时候,也可以用无限循环break配合,效果可能比用while( 条件 )要好。


by AnGel_Fox @ 2024-12-17 09:58:22

@computer11好的好的,谢谢


|