方法一:朴素算法:O(n)。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int get_num(int n){ 4 int num=0; 5 for(int i=1;i<=n;++i) 6 if(n%i==0)num++; 7 return num; 8 } 9 int get_sum(int n){ 10 int tot=0; 11 for(int i=1;i<=n;++i) 12 if(n%i==0)tot+=i; 13 return tot; 14 } 15 int main(){ 16 int n; 17 while(cin>>n){ 18 cout<<get_num(n)<<endl;//求n的因子个数 19 cout<<get_sum(n)<<endl;//求n的因子数之和 20 } 21 return 0; 22 }
方法二:公式法:O(√n)。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int get_num(int n){ 4 int tot=1; 5 for(int i=2;i*i<=n;++i){ 6 if(n%i==0){ 7 int x=0; 8 while(n%i==0){ 9 n/=i; 10 x++; 11 } 12 tot*=(x+1); 13 } 14 } 15 if(n>1)tot*=2; 16 return tot; 17 } 18 int get_sum(int n){ 19 int tot=1; 20 for(int i=2;i*i<=n;i++){ 21 if(n%i==0){ 22 int mul=1; 23 while(n%i==0){ 24 n/=i; 25 mul*=i; 26 } 27 tot*=(mul*i-1)/(i-1); 28 } 29 } 30 if(n>1)tot*=(n+1); 31 return tot; 32 } 33 int main(){ 34 int n; 35 while(cin>>n){ 36 cout<<get_num(n)<<endl;//求n的因子个数 37 cout<<get_sum(n)<<endl;//求n的因子数之和 38 } 39 return 0; 40 }