求 1 到 n 的所有数的约数和

 

求 1 到 n 的所有数的约数和

暴力方法就是枚举每个数,算出他的约数和即可,这样有点慢。

另一种思路,枚举约数,判断他是谁的约数,并记录(即他的倍数有多少个),在乘以他自己。

n/i求的是n以内,i的倍数有多少个,在乘以i即可。

可以发现,枚举到n/2时,往后的所有数的倍数只有他自己,n/i = 1(i>n/2),这里可以用数学方法算出。

代码:

 1 #include<cstdio>
 2 
 3 int main()
 4 {
 5     int n,ans = 0;
 6     scanf("%d",&n);
 7     
 8     for (int i=1; i<=n; ++i)
 9     {
10         ans += (n/i)*i;
11     }
12     
13     printf("%d",ans);
14     
15     return 0;
16 }

 

posted @ 2017-08-08 15:00  MJT12044  阅读(2025)  评论(0编辑  收藏  举报