黑客排名:项目欧拉#1

时间:2015-03-05 18:58:50

标签: c algorithm function

我是竞争性编程的新手,我在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;
}

我的代码中有什么错误。为什么不被接受?

1 个答案:

答案 0 :(得分:1)

有几个问题。

int返回时,您的func确实溢出了。此外,您的printf声明应为printf("%llu\n", count);

因此,funccount和本地变量j的回复应该都是unsigned long long,您的打印输出也应该反映出来。您需要j unsigned long long,因为func的return语句中的算术运算(这至少在VS 2013中就是这种情况)。