【题目描述】
自然数a的因子是指能整除a的所有自然数,但不含a本身。例如12的因子为:1,2,3,4,6。若自然数a的因子之和为b,而且b的因子之和又等于a,则称a,b为一对“亲和数” 。求最小的一对亲和数(a<>b)。
【输入】
(无)
【输出】
1行,分别为a和b(a<b)。
【输入样例】
(无)
【输出样例】
(无)
C++:
#include<iostream> using namespace std; int judge(int x); //计算因子之和的函数 int main() { for(int i=1;;i++) //循环遍历直到找到为止 { if(i==judge(judge(i))&&i!=judge(i))//如果a的因子之和的因子之和等于并且a的因子之和不等于a { //这里信奥赛上的题目好像少说了a!=b这一条件 cout<<i<<' '<<judge(i)<<endl; //满足条件就输出并且结束遍历 break; } } return 0; } int judge(int x) { int sum=0; for(int i=1;i<x;i++) //遍历计算能被x整除的数之和 if(x%i==0) sum+=i; return sum; //返回总和 }
C语言:
这里我用C语言写的代码用了两个函数,一个函数是用来判断是否满足题目条件的,另一个函数是用来计算一个数所有因子的和的
#include<stdio.h> bool judge(int x); //用来判断是否满足条件的函数 int total(int x); //用来计算一个数所有因子之和的函数 int main() { int i=1; while(i) //从1开始循环遍历判断 { if(judge(i)) { printf("%d %d",i,total(i)); //满足条件的话输出该对亲和数(即该数和该数的所有因子之和) break; } i++; } } bool judge(int x) { int sum=0; //表示该数所有因子之和 int b=0; //表示该数的所有因子之和的因子之和 for(int i=1;i<x;i++) { if(x%i==0) //能整除i的就是该数的因子 sum+=i; } for(int i=1;i<sum;i++) //再次计算因子之和 { if(sum%i==0) //不过这次是计算上个数因子之和的因子之和 b+=i; } if(b==x && sum!=x) //该数的因子之和的因子之和等于本身而且该数的因子之和不等于本身时就返回真 return true; else return false; //否则为假 } int total(int x) //同上 { int sum=0; for(int i=1;i<x;i++) { if(x%i==0) sum+=i; } return sum; }