题目链接:点击打开链接
找一个数的所有约数模板题。
对于数n,枚举1到sqrt(n)中n的约数,这样每找到一个约数p,n/p就也是一个约数(排除n/p==p的情况)。时间复杂度缩小到sqrt(n)。
开平方时用pow(n,0.5) wa了 改成sqrt(n)就ac了,有大神说sqrt精度更高,所以以后开方还是用sqrt吧
代码:
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
int n;
scanf("%d",&n);
int res=0;
int sqr=sqrt(n*1.0);
for(int i=1;i<=sqr;i++){
if(n%i==0){
res+=i;
if(i!=n/i&&i!=1) res+=n/i;
}
}
if(n==1)res=0;
printf("%d\n",res);
}
return 0;
}