北航机试15年01题:相亲数
问题:相亲数
描述:
如果对于两个大于1的正整数x和y,x除了本身以外的因子之和等于y,y除了本身以外的因子之和等于x,则称x和y是一对相亲数。 比如220除了本身以外的因子之和110+55+44+22+20+11+10+5+4+2+1=284,而284除了本身以外的因子之和142+71+4+2+1=220,则220和284就是一对相亲数。 请你编写一个程序计算x和y分别除了本身以外的因子之和,并判断x和y是不是一对相亲数。x和y为大于1的int范围内的整数。
输入:x和y,空格隔开。
输出:第一行输出x,一个逗号,x的除了本身以外的因子之和的计算过程(见题意,要求降序输出每个因子),不要有多余的空格。 第二行输出y,一个逗号,y的除了本身以外的因子之和的计算过程(见题意,要求降序输出每个因子),不要有多余的空格。 第三行,如果x和y是一对相亲数输出1,否则输出0。文末换行可有可无。
样例:
标准输入 | 标准输出 |
---|---|
220 284 | 220,110+55+44+22+20+11+10+5+4+2+1=284 84,142+71+4+2+1=220 1 |
1184 1120 | 1184,592+296+148+74+37+32+16+8+4+2+1=1210 1220,560+280+224+160+140+112+80+70+56+40+35+32+28+20+16+14+10+8+7+5+4+2+1=1904 0 |
直接上代码
/*
北航机试15年01相亲数:
从2开始求约数,保存在数组中
*/
#include<stdio.h>
#include<math.h>
int a[50], b[50], buf[50]; //保存x,y的约数
//输出结果
void output(int *x,int *buf, int *size, int *sum){
printf("%d,", *x);
for(int i=*size-1;i>0;i--){
printf("%d+", buf[i]);
}
printf("1=%d\n", *sum);
}
int main(){
int x, y, sumx, sumy;
int sizea, sizeb;
while(scanf("%d%d", &x, &y)!=EOF){
sizea=sizeb=sumx=sumy=a[0]=b[0]=1;
//计算x的约数, 为提高速度,只用求出x^(1/2)内的约数即可
int bound=(int)sqrt(x)+1;
int i, len=0;
for(i=2;i<bound;i++){
if(x%i==0){
a[sizea++]=i;
buf[len++]=x/i;
sumx+=i+x/i;
}
}
for(i=len-1;i>=0;i--){
a[sizea++]=buf[i];
}
//计算y的约数
len=0;
bound=(int)sqrt(y)+1;
for(i=2;i<bound;i++){
if(y%i==0){
b[sizeb++]=i;
buf[len++]=y/i;
sumy+=i+y/i;
}
}
for(i=len-1;i>=0;i--){
b[sizeb++]=buf[i];
}
output(&x, a, &sizea, &sumx);
output(&y, b, &sizeb, &sumy);
if(sumx==y && sumy==x) printf("1\n");
else printf("0\n");
}
return 0;
}