【发布时间】:2019-01-13 15:57:27
【问题描述】:
我正在尝试编写一个函数来查找从 2 到给定上限的所有友好数字对。
我写了一个函数来求给定数的除数之和。
我还编写了一个函数,它使用以下事实:如果 num1 的除数之和为 S(num1),并且 num2=s(num1)- num1 的除数和相同,则 num1 和 num2 是友好数。
这是我的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
void amicableNumbers(int n);
int findSumOfDevisors(int num);
void main() {
int upperRange;
printf("enter the value for upper range: ");
scanf("%d", &upperRange);
printf("the amicable numbers between 2 and %d:\n", upperRange);
amicableNumbers(upperRange);
}
void amicableNumbers(int n) {
int sum, sum2, i;
for (i = 2; i <= n; i++) {
sum = findSumOfDevisors(i);
if (sum > i && sum <= n) {
sum2 = findSumOfDevisors(sum);
if (sum2 == i)
printf("%d and %d \n", i, sum);
}
}
}
int findSumOfDevisors(int num) {
int sum = 1, i, n;
n = (int)sqrt((double)num);
for (i = 2; i <= n; i++) {
if ((n % i) == 0) {
sum += i;
sum += n / i;
}
}
return sum;
}
但是,当我运行它时,我得到了错误的输出。例如,对于upperRange 301,我知道2-301 范围内没有任何友好数字。
亲和数 是两个不同的数,其相关性使得每个数的真除数之和等于另一个数。例如,对 220 和 284 是友好的数字。 220的真因数之和为1+2+4+5+10+11+20+22+44+55+110=284,284的真因数之和为1+2+4+71+ 142=220。
一个数的适当除数是该数的一个正因数,除了数本身。
【问题讨论】:
-
@chux 是的,是的,先生。他对 findSumOfDevisors 有疑问
-
n =(int) sqrt((double)num);可能无法提供所需的整数平方根,因为sqrt()可能存在轻微的不准确性。建议只使用整数数学:for (i = 2; i <= num/i; i++) -
findSumOfDivisors* -
OT:无论 Visual Studio 让程序员侥幸逃脱,
main()的返回类型始终是int -
OT:调用任何
scanf()系列函数时,始终检查返回值(不是参数值)以确保操作成功。