我在算术级数公式方面遇到了一些麻烦。
我正在尝试项目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 == 0
,n % 5 == 0
和n % 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)实现,不应该是一个问题。
答案 0 :(得分:1)
long long int sum = 0;
... printf("%d\n", sum);
是一个错误。请对%lld
值使用long long int
格式说明符。此外,如果您不想要负值,那么也许您可以使用unsigned long long int
代替(对应%llu
)。