使用函数求正整数X以内的所有亲密数对
描述
求正整数X以内的所有亲密数对。若正整数A的所有因子(包括1但不包括自身,下同)之和为B,而B的因子之和为A,且A与B不相等,则称A和B为一对亲密数对。
要求:构建函数便于求出i的因子和,在main函数中调用该函数。
输入
输入一个正整数X
输出
输出正整数X内所有的亲密数对。每一个亲密数对(A,B)占一行,两个数用空格分隔,且A < B。按照亲密数对中A从小到大的顺序输出所有的亲密数对。
首先先写一个判断亲密数的函数
int fri(int n){
int count=0;
for(int i=1;i<n;i++){ //因子们
if(n%i==0){
count+=i;
}
}
return count;
}
然后再写遍历,出现了一个问题,第一次写的时候用了嵌套的for循环,导致计算量巨大计算机完不成计算
然后想着优化一下,不用那么多for循环,解决方案就是把每个数的fri数记为num,继续遍历数,找到与fri数相等的数,然后输出这个数i和num
问题又出现了,就是会有重复的数,解决方案就是把该num存为a,让i不等于a时再输出
for(int i=2;i<x;i++){
num=fri(i);
if(fri(num)==i&&i!=num&&i!=a){
a=num;
printf("%d %d\n",i,num);
}
}
最后的整体代码
#include<stdio.h>
int fri(int n){ //计算因子们
int count=0;
for(int i=1;i<n;i++){
if(n%i==0){
count+=i;
}
}
return count;
}
int main(){
int x;
int num;
int a;
scanf("%d",&x);
for(int i=2;i<x;i++){ //遍历范围内的数
num=fri(i); //找出这个数的fri数,并存为num
if(fri(num)==i&&i!=num&&i!=a){ //判断num的fri数是否等于i,等于就输出
a=num;
printf("%d %d\n",i,num);
}
}
}