关于这个主题有很多讨论。我经历过他们,但没有人帮忙。
问题似乎很简单:
如果我们列出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它也不适用于大输入?
答案 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)。
(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;
}