【发布时间】:2015-06-17 08:38:58
【问题描述】:
关于这个话题有很多讨论。我经历了它们,但没有任何帮助。
这个问题看起来很简单:
如果我们列出所有小于 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;
}
为什么即使使用 unsigned long long int 也不能处理大量输入?
【问题讨论】:
-
我不知道这是否是最好的,但您可以为
3设置一个循环,它只会迭代您当前实现的三分之一,并且没有if也检查。想一想。 -
您需要使用大量数据进行分析,以找出大部分时间都花在了哪里。
-
求助于数学。您正在寻找 3 的所有倍数的总和加上 5 的所有倍数的总和减去 15 的所有倍数的总和,所有这些都可以在恒定时间内计算出来。