0
已解决
乔俊驰
资深守护
资深守护
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
int ans;
void tq(int n){
ans=0;
for(int i=1;i<=n;i++){
if(n%i==0){
ans+=i;
}
}
}
int main(){
int n,m;
cin>>n;
for(int i=1;i<=n;i++){
cin>>m;
tq(m);
cout<<ans<<endl;
}
return 0;
}
思路:定义一个函数和ans,每次函数开始ans=0,然后提取m的因数并累加,最后循环输入输出,但奈何数据太大,超时了,有啥优化算法吗
0
已采纳
蔡乐毅
高级光能
高级光能
线筛学过吗?
用线筛把每个数的数字和全部记好
像这样:
for(int i=1;i<=5000000;i++){
for(int j=i;j<=5000000;j+=i){
f[j]+=i;
}
}
输入一个数据,输出f[n];
记得要用scanf("%.d",&n);和prinf("%.df",f[n]\n);
还有头文件!
蔡乐毅在2020-11-01 13:12:02追加了内容
顶
蔡乐毅在2020-11-01 13:13:57追加了内容
@乔俊驰
~望采纳~
0
蒋文瀚
新手光能
新手光能
#include<cmath>
void tq(int n){
ans=0;
for(int i=1;i<=sqrt(n);i++){
if(n%i==0){
ans+=i;
}
}
}
0
0
余彦文
初级光能
初级光能
你可以从1到sqrt(n)开始循环,然后判断n%i是否等于零如果是,sum+=i,sum+=n/i
还有,要考虑一下i==n/i的情况
然后呢?你做了70分(滑稽)
0
赵逸凡
初级启示者
初级启示者
把函数里的循环i从1到sqrt(n),然后累加的时候把i和n/i都加上,可能会提速(把循环次数改写为O(1)语句有不确定性)
建议艾筛、线筛、或者min_25筛,不过这些算法太复杂了,线筛应该能过
0