C++中怎么算约数

C++中怎么算约数,第1张

已经AC,

代码:

#include<stdio.h>

#include<stdlib.h>

int CountDivisorsSum(int num)

{

    int i = 0

    int DivisorsSum = num

    for(i = 1 i <= num / 2 i++)

    {

        if(num % i == 0)

        {

            DivisorsSum += i

        }

    }

    return DivisorsSum

}

int main(void)

{

    int num = 0

    scanf("%d", &num)

    printf("%d", CountDivisorsSum(num))

    return 0

}

1和自然数本身都是自然数的约数,但是如果该自然数是1,输出也因为为1,在程序中,直接把约数的和初始化为自然数int DivisorsSum = num如果自然数是1,是不会执行下面的for循环的,for循环只需要从1到num/2就够了,因为一个自然数的最大约数一定小于或等于num/2。望采纳!

#include "stdafx.h"

int main(int argc, char* argv[])

{  

 int i,q,sum=0

    scanf("%d",&q)

    for(i=1i<=qi++)//这里你不能取i=0,那样是错的。0能做被除数吗?改为1 

    {

  if(q%i==0)

        sum=sum+i

 }

    printf("%d",sum)

 return 0

}

已编译通过。望采纳。

下面的办法看看是否效率高一些:

首先用辗转相除法求出两个数的最大公约数

然后将这个公约数分解为2^e2

*

3

^e3

*

5

^e5

*7

^e7...,其中的e2、e3、

e5...等分别代表2、3、5...等素数的指数,也就是分解为素数的因子积,这个过程可以用循环加上数组记录各个素数的指数次数来完成

然后公约数的个数从1开始计算,总数为(e2+1)*(e3+1)*(e5+1)*(e7+1)....,这个过程将刚才的数组用循环就可以得到了

例如:gcd(20,

30)

=

10,10=

2^1

*

5^1,所以公约数个数为(1+1)*(1+1)

=

4

不过程序中需要注意的是,防止计算因子个数乘到后来溢出,不过大部分数字一般都不会


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11513077.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存