我是竞争性编程的新手,我在 Hacker Rank 上做了一道题。问题陈述如下:
“如果我们列出所有 10 以下的自然数,它们是 3 或 5 的倍数,我们会得到 3、5、6 和 9。这些倍数的总和是 23。
求出 N 以下所有 3 或 5 的倍数之和。
输入格式 第一行包含 T,表示测试用例的数量。接下来是 T 行,每行包含一个整数 N。
输出格式 对于每个测试用例,打印一个整数,表示低于 N 的所有 3 或 5 的倍数之和。”
约束
1≤T≤10^5
1≤N≤10^9
我编写了以下代码,它成功地满足了 3 个测试用例,但在剩下的两个测试用例中失败了。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int func(int p,int n)
{
int j;
n=n-1;
j=n/p;
return (p*j*(j+1))/2;
}
int main()
{
unsigned long int n;
int t,j,count;
scanf("%d",&t);
if(t>=1 && t<=100000){
for(j=0;j<t;j++)
{
scanf("%lu",&n);
if(n>=1 && n<=1000000000)
{
count=func(3,n)+func(5,n)-func(15,n);
printf("%d\n",count);
}
}}
return 0;
}
我的代码有什么错误。为什么它没有被接受?
最佳答案
有几个问题。
当从 func
返回时,您确实溢出了 int
。此外,您的 printf
语句应该是 printf("%llu\n", count);
因此,func
的返回值、count
和局部变量 j
都应该是 unsigned long long
并且您的打印输出也应该反射(reflect)出这一点。您需要制作 j
unsigned long long
因为 func
的返回语句中的算法(至少在 VS 2013 中是这种情况) .
关于c - 黑客排名 : Project Euler#1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28885581/