使用算术级数来查找倍数之和

时间:2015-04-16 04:54:21

标签: c

我在算术级数公式方面遇到了一些麻烦。

我正在尝试项目Euler的问题#1但是在hackerranks网站上。

这就是我得到的:

#include <stdio.h>

int main(){

int test_cases, n;
char string[100];

fgets(string, 100, stdin);
sscanf(string, "%d", &test_cases);

while(test_cases--){
    fgets(string, 100, stdin);
    sscanf(string, "%d", &n);
    long long int sum = 0;

    long long int s1 = n / 3;
    long long int s2 = n / 5;
    long long int s3 = n / 15;

    long long int last_term_remainder_3 = n % 3;
    long long int last_term_remainder_5 = n % 5;
    long long int last_term_remainder_15 = n % 15;

    s1 = n % 3 == 0 ? s1 - 1 : s1;
    s2 = n % 5 == 0 ? s2 - 1 : s2;
    s3 = n % 15 == 0 ? s3 - 1 : s3;

    long long int last_term_3 = last_term_remainder_3 == 0 ? n - 3 : n - last_term_remainder_3;
    long long int last_term_5 = last_term_remainder_5 == 0 ? n - 5 : n - last_term_remainder_5;
    long long int last_term_15 = last_term_remainder_15 == 0 ? n - 15 : n - last_term_remainder_15;


    sum = (s1 * (3 + last_term_3)) / 2.0;
    sum += (s2 * (5 + last_term_5)) / 2.0;
    sum -= (s3 * (15 + last_term_15)) / 2.0;

    printf("%d\n", sum);
}

return 0;
}

我已经阅读了关于公式的维基百科页面并相应地实现了它。 我的解决方案解决了10和100的样本测试案例,分别以23和2318作为答案。

它也正确地解决了测试用例0,1,4,只给出了测试用例2和3的错误答案。

在网站上建议将int更改为long long int,但这没有帮助。

还建议在n % 3 == 0n % 5 == 0n % 15 == 0时检查边缘情况,这就是我的原因:

    s1 = n % 3 == 0 ? s1 - 1 : s1;
    s2 = n % 5 == 0 ? s2 - 1 : s2;
    s3 = n % 15 == 0 ? s3 - 1 : s3;

我看不到测试用例,所以我不确定我的程序出错了。我非常感谢任何关于我能学会找出答案的指示。

编辑:在其中一个失败的测试用例中,它说:0.03s错误答案。它没有给出另一个失败案例的时间。它说的是错误的答案,而不是与超时有关的任何事情。据我所知,这是一个O(1)实现,不应该是一个问题。

1 个答案:

答案 0 :(得分:1)

long long int sum = 0; ... printf("%d\n", sum);是一个错误。请对%lld值使用long long int格式说明符。此外,如果您不想要负值,那么也许您可以使用unsigned long long int代替(对应%llu)。