约数个数的和(C语言)

题目描述 

给个n,求1到n的所有数的约数个数的和~

输入描述:

第一行一个正整数n

输出描述:

输出一个整数,表示答案

输入

复制

3

输出

复制

5

说明

样例解释:
1有1个约数1
2有2个约数1,2
3有2个约数1,3

备注:

n <= 100000000

正常想法是用一个双重循环对每个数的约数查找,发现是约数则加1,但是这样简单的想法当然是The Time Limited,所以要请出我们的数论了,数学还是非常重要的。

初次接触这样理解:

1~n的约数中都有1,即是1的倍数的数都有约数1;(约数1出现n次)

1~n中是2的倍数的数都有约数2;(约数2出现n/2次)

1~n中是3的倍数的数都有约数3;(约数3出现n/3次)

······

1~n中是n的倍数的数都有约数n;(约数n出现1次)

所以1到n的所有数的约数个数的和为sum(约数)=sum(1)+sum(2)+sum(3)+···+sum(n)=n + n/2 + n/3 + ··· +1

AC正解

#include<stdio.h>
int main()
{
    int n,i;
    int sum=0;
    scanf("%d",&n);
    for(i=1;i<=n;++i)
    {
        sum+=n/i;
    }
    printf("%d",sum);
    return 0;
}

实现就是简单的一步了,数学给赞 。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值