已经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
不过程序中需要注意的是,防止计算因子个数乘到后来溢出,不过大部分数字一般都不会
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)