关于这个话题有很多讨论。我看了一遍,但没有一个有用。
问题似乎相当简单:
如果我们列出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,它也不适用于大输入?
问题超时可能设置为一个值,该值不允许像您这样的暴力算法。您可以使用连续整数和的闭合公式和德摩根定律,在恒定时间内计算任意给定值N的和。
我试过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)
我建议使用两个加法循环,并消除昂贵的%
运算符。
假设所有可被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请求查询,其中每个查询由