c ++ - hackerrank项目euler#1因超时而终止

时间:2015-04-11 18:31:44

标签: c++ timeout

关于这个主题有很多讨论。我经历过他们,但没有人帮忙。

问题似乎很简单:

  

如果我们列出10以下的所有自然数,它们是3或3的倍数   5,我们得到3,5,6和9.这些倍数的总和是23。

     

求出N以下3或5的所有倍数之和。

     

输入格式第一行包含表示测试次数的T.   案例。接下来是T行,每行包含一个整数N。

     

输出格式对于每个测试用例,打印一个表示该值的整数   N的所有倍数为3或5的总和。

     

约束1≤T≤10^ 51≤N≤10^ 9

但是,对于两个测试用例,很可能是输入较大的测试用例,我的代码会因超时而终止。

这是我的代码:

int main() {
    unsigned long long int n,t;
    unsigned long long int sum;
    cin>>t;
    while(t--)
        {
        sum=0;
        cin>>n;
        for(unsigned long long int i=3;i<n;i++){
            if(i%3==0 || i%5==0){
                sum+=i;
            }
        }
        cout<<sum<<"\n";
    }

    return 0;
}

为什么即使使用unsigned long long int它也不适用于大输入?

4 个答案:

答案 0 :(得分:6)

我建议使用两个添加循环并删除昂贵的%运算符。

鉴于所有可被3整除的数字也都是添加了3的数字。因此,测试一个数字的可分性3并将它们相加,只需将数字加到3的倍数。

例如:

for (int i = 0; i < n; i = i + 3)
{
  sum += i;
}

如果还包含5的循环,则可以将所有值相加。

此外,减去15的倍数值。

另一方面,应用一点代数和微积分,你可以简化公式,然后实现它。

一些分析

可被3整除的值的数量小于N/3。所以对于N = 13,有4个倍数的3:3,6,9,12。所以 limit 是N / 3。

以代数方式分解,我们看到N = 13的数字是:

[1] (3 * 1) + (3 * 2) + (3 * 3) + (3 * 4)  

考虑3个收益率的共同乘数:

[2]  3 * ( 1 + 2 + 3 + 4)

观察等式[2],得到3 *和(1..N)。

使用formula for summation

(x * (x + 1)) / 2

该等式可以简化为:

[3] 3 * ( 4 * (4 + 1) ) / 2

或者用N / 3替换总值这个公式得出:

[4] 3 * ((N/3) * ((N/3) + 1) ) / 2

方程式[4]的简化留给读者练习。

答案 1 :(得分:1)

我在python中试过,你可以检查

def multiple(n): 
    return n*(n+1)/2
def sum(n): 
    return multiple(n/3)*3 + multiple(n/5)*5 - multiple(n/15)*15
for i in xrange(int(raw_input())):
    n = int(raw_input()) - 1
    print sum(n)

答案 2 :(得分:0)

问题超时可能设置为不允许像您这样的强力算法的值。您可以使用闭合公式计算连续整数和De Morgan定律的总和来计算任何给定N值的总和。

答案 3 :(得分:0)

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


int main() {
    /* Enter you`enter code here`r code here. Read input from STDIN. Print output to STDOUT */  
    long long int t, N, i=0, sum3=0, sum5=0, sum35=0;
    cin >> t;
    while(i<t){
        cin >> N;
        N=N-1;
        sum3 = 3 * ((N/3) * ((N/3) + 1) ) / 2;
        sum5 = 5 * ((N/5) * ((N/5) + 1) ) / 2;
        sum35 = 15 * ((N/15) * ((N/15) + 1) ) / 2;       
        cout << sum3 + sum5 - sum35 << endl;
        sum3=sum5=sum35=0;
        i++;
    }


    return 0;
}