这道题要用到数论上的一些知识。
根据上图就很容易理解下面的代码了。
方法一:筛选法
#include<iostream>
using namespace std;
int main(){
int t,n,s,i;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
s=1;
for(i=2;i*i<=n;i++){//只需要穷举到∨n
if(n%i==0){
s=i*i<n?s+i+n/i:s+i;//这段等价于下面3行代码
//s=s+i;
//if(i*i<n)
//s=s+n/i;
}
}
printf("%d\n",s);
}
return 0;
}
方法二:(网上看到的一种比较有创意的方法,很简洁,不得不佩服!值得学习。)
#include <iostream>
using namespace std;
int wife[500010] = {0};
int main( )
{
for( int i = 0; i < 500001; ++i )
wife[i] = 1;
for( int i = 2; i < 500001; ++i )
for( int j = 2; i * j < 500001; ++j )
wife[i*j] += j;
int T;
cin >> T;
while( T-- )
{
int N;
cin >> N;
cout << wife[N] << endl;
}
return 0;
}
方法三:(这个也很有创意)
#include <stdio.h>
int t,n,f[500001];
void Init()
{
int i,j;
for (i=1;i<=250000;i++)
{
for (j=i+i;j<=500000;j=j+i)
f[j]=f[j]+i;
}
}
int main()
{
Init();
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
printf("%d\n",f[n]);
}
return 0;
}
好的代码看得真的让人赏心悦目啊。