通常在解决有关hackerrank codechef的问题时,我的代码会因某些测试用例而超时。我知道这是因为我的代码效率不高,我需要减少代码的时间复杂度。
在这个特殊问题中Project Euler Multiples of 3 and 5我似乎不明白测试用例是如何超时的。如果我没错,代码在O(n ^ 2)中运行,那也考虑了用于获取测试用例的循环。如何使我的代码高效?
问题的描述在链接中。
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int t, n;
int n1,n2;
int mul3, mul5, sum=0,sum3=0,sum5=0;
cin>> t;
while(t--){
cin>>n;
sum=0;
sum5=0;
sum3=0;
if(n%3==0)
n1=n/3-1;
else
n1=n/3;
if(n%5==0)
n2=n/5-1;
else
n2=n/5;
for(int i=0;i<=n1;i++){
if(i<=n2){
mul5= i*5;
sum5+=mul5;
}
mul3=i*3;
if((mul3%5)!=0)
sum3+=mul3;
sum = sum3+sum5;
}
cout << sum << endl;
}
system("PAUSE");
return 0;
}
答案 0 :(得分:0)
您不需要遍历所有数字,但您绝对无法为n=10^9
执行n ^ 2次操作。正确的解决方案需要对数论和对给定值可整除的数的计数有一点了解。你能想出一种方法来计算可被5整除到X
的数字的数量吗?尝试以不变的复杂性来做到这一点。然后对可被3整除的数字执行类似的操作并应用包含 - 排除原则。
请注意:优化代码无论多好,只会略微提高其性能。另一方面,改变算法可能会改变其复杂程度的数量级。
答案 1 :(得分:0)
也许在这里看一下可以帮助你获得O(1)解决方案Inclusion–exclusion principle。
对于此问题集,A
包含可被3
整除的数字,集B
包含可被5
整除的数字。 A∩B
由3 and 5
可分割的数字组成。所以,
A={3,6,9,...,999}
这形成了一个算术系列。您可以使用标准公式找到此总和。对其他2套做同样的事情就完成了。