当前位置: 首页 > 知识库问答 >
问题:

c-hackerrank项目euler#1由于超时而终止

耿学义
2023-03-14

关于这个话题有很多讨论。我看了一遍,但没有一个有用。

问题似乎相当简单:

如果我们列出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

然而,对于两个测试用例,最有可能是具有大输入的测试用例,我的代码由于超时而终止。

这是我的密码:

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;
}

为什么即使使用无符号long int,它也不适用于大输入?

共有3个答案

郑曜灿
2023-03-14

问题超时可能设置为一个值,该值不允许像您这样的暴力算法。您可以使用连续整数和的闭合公式和德摩根定律,在恒定时间内计算任意给定值N的和。

黄朗
2023-03-14

我试过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)
钱睿范
2023-03-14

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

假设所有可被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。因此,限值为N/3。

通过代数分解,我们可以看到N=13的数字是:

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

考虑到3个收益率的公倍数:

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

看看等式[2],这产生3*和(1...n).

使用公式求和:

(x * (x + 1)) / 2

该方程可简化为:

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

或者用N/3替换总值,该公式得出:

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

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

 类似资料:
  • 我试图解决hackerrank的一个问题,当我提交我的解决方案时,我得到一个错误,说明“由于超时而终止”。 请检查代码,并建议我如何优化。 语句:您有一个空序列,将向您提供查询。每个查询都是以下三种类型之一: 1 x-将元素x推入堆栈。2-删除堆栈顶部的元素。3-打印堆栈中的最大元素。 输入格式 输入的第一行包含一个整数。接下来的每一行都包含上述查询。(保证每个查询都是有效的。) 输出格式 对于每

  • 当我只为一些特定的测试用例运行代码时,我得到了一个“由于超时错误而终止”。即使我的代码为其他测试用例成功编译。有人能帮我吗? 链接-https://www.hackerrank.com/challenges/phone-book 问题陈述: 你会得到一本电话簿,里面有人们的名字和电话号码。之后,你会得到一些人的名字作为查询。对于每个查询,打印该人的电话号码。 输入格式: 第一行有一个整数,表示通讯

  • 我正在尝试解决一个来自HackerRank的问题,当我提交我的解决方案时,我得到一个错误,说明“由于超时而终止”。 问题:对n个大小的数组的左旋转操作将数组的每个元素向左移动1个单位。例如,如果对数组[1,2,3,4,5]执行两次左旋转,那么该数组将变为[3,4,5,1,2]。 给定一个由n个整数和一个数字d组成的数组,对该数组执行d个左旋转。然后将更新后的数组打印为单行以空格分隔的整数。 输入格

  • 我在google cloud中创建了一个google cloud函数,它将连接到我在google cloud中创建的postgresql实例。 我正在使用'pg'节点模块。 我已经为此创建了一个私有IP。 我收到以下错误: 错误:由于在timeout.ConnectionTimeouthAndle.SetTimeout(/workspace/node_modules/pg/lib/client.j

  • 我的代码: 输出:

  • 这段代码在Hackerrank上的一些大输入上显示“Terminated due to timeout”(因超时而终止)错误,但在其余情况下仍能正常工作。请帮助我改进此代码。 约翰·沃森在整数数组上执行一个称为右圆旋转的操作。执行一次右圆旋转操作后,数组将从 转换为 。 Watson多次执行此操作。为了测试Sherlock识别旋转数组中特定位置的当前元素的能力,Watson请求查询,其中每个查询由