求 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 }