C语言亲密数求教!!!
问题描述】给出一个数,寻找小于这个数的所有亲密数对。
【输入形式】
【输出形式】
【样例输入】
300
【样例输出】
220 284
亲密数是指两个正整数中,第一个数的所有真因子之和等于第二个数,而且第二个数的所有真因子之和等于第一个数。例如,220的所有真因子(除了其本身)是1、2、4、5、10、11、20、22、44、55和110,它们的和是284。而284的所有真因子是1、2、4、71和142,它们的和是220。
要求小于给定数的所有亲密数对,我们可以先写一个函数来计算一个数的真因子之和,然后遍历给定数以下的每一个数,判断它是否有对应的亲密数对。
下面是完整的代码实现:
#include <stdio.h>
// 计算一个数的真因子之和
int sumOfProperDivisors(int num) {
int sum = 1;
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
sum += i;
if (i * i != num) {
sum += num / i;
}
}
}
return sum;
}
int main() {
int n;
printf("请输入一个正整数:");
scanf("%d", &n);
printf("%d以下的亲密数对有:\n", n);
for (int i = 1; i < n; i++) {
int sum1 = sumOfProperDivisors(i);
int sum2 = sumOfProperDivisors(sum1);
if (sum2 == i && sum1 != i) {
printf("%d %d\n", i, sum1);
}
}
return 0;
}
以上的代码中,`sumOfProperDivisors`函数用来计算一个数的真因子之和。注意,在计算真因子之和时只需要遍历到平方根即可,这样可以节省很多时间。在主函数中,我们按顺序遍历小于给定数的每一个数,判断它是否有亲密数对,并打印出来。
希望能帮到你!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 本帖最后由 jackz007 于 2024-5-28 14:36 编辑
#include <stdio.h>
/* 如果一个正整数 d 除本身 (d) 以外的所有因数之和为 e ,而 e
除本身 (e) 以外的所有因数之和为 d,那么,称 d、e 为亲密数。*/
int foo(int d)
{
int e , k ;
for(k = 1 , e = 2 ; e < d ; e ++) if(! (d % e)) k += e ;
return k ;
}
int main(void)
{
int c , d , e , n ;
scanf("%d" , & n) ;
for(c = 0 , d = 2 ; d <= n ; d ++) {
e = foo(d) ;
if(d > e && foo(e) == d) {
printf("%d %d\n" , e , d) ;
c ++ ;
}
}
if(! c) printf("not found.\n") ;
}
编译、运行实况:
D:\\C>g++ -o x x.c
D:\\C>x
300
220 284
D:\\C>
页:
[1]