输入格式:
输入文件包含多组输入数据。
每组数据有三个正整数A,B1,B2(1 <= A,B1,B2 <= 10^9),其中A为C的约数和,而对于C的所有约数的倒数之和B,为避免精度误差,以分数B1/B2的形式给出。
输入文件以“0 0 0”结束。
输出格式:
对于输入的每一组数据输出一行,该行的第一个整数N为所有满足条件的不同的C的个数,其后输出N个满足条件的C。相邻整数之间用空格隔开,行末不要有空格。
输入样例:
18 9 5
1 1 2
1 1 1
0 0 0
输出样例:
1 10
0
1 1
本人代码:
<span style="font-size:18px;">#include<stdio.h>
int yue_shuSum(int a,int* top,int* base)
{
int sum=0;
*top=0;
*base=1;
for(int i=1; i<=a; i++) {
if(a%i == 0) {
sum+=i;
*top=(*top)*i+1*(*base);
(*base)*=i;
}
}
return sum;
}
int yue_fen(int x,int y)
{
int a=x;
int b=y;
int c=0;
while(b != 0) {
c=a%b;
a=b;
b=c;
}
return a;
}
int main()
{
FILE* fp=fopen("x.txt","rt");
int A=0;
int B1=0;
int B2=0;
int C=0;
int B=0;
int top=0;
int base=0;
int count=0;
int i=0;
int a[10];
int num1=0;
int num2=0;
int num3=0;
if(fp==NULL) {
printf("打开文件失败!");
return 0;
}
num1=fgetc(fp);
while(num1 != ' ') {
A=A*10+num1-'0';
num1=fgetc(fp);
}
num2=fgetc(fp);
while(num2 != ' ') {
B1=B1*10+num2-'0';
num2=fgetc(fp);
}
num3=fgetc(fp);
while(num3 != '\n') {
B2=B2*10+num3-'0';
num3=fgetc(fp);
}
while(A!=0 || B1!=0 || B2!=0) {
printf("%d %d %d\n",A,B1,B2);
i=0;
count=0;
for(C=0; C<=A; C++) {
int x=yue_shuSum(C,&top,&base);
int s=yue_fen(top,base);
int b=yue_fen(B1,B2);
top/=s;
base/=s;
B1/=b;
B2/=b;
if(x==A && top==B1 && base==B2) {
count++;
a[i]=C;
i++;
}
}
printf("%d",count);
for(int j=0; j<i; j++) {
printf(" %d",a[j]);
}
printf("\n");
A=0;
B1=0;
B2=0;
num1=fgetc(fp);
while(num1 != ' ') {
A=A*10+num1-'0';
num1=fgetc(fp);
}
num2=fgetc(fp);
while(num2 != ' ') {
B1=B1*10+num2-'0';
num2=fgetc(fp);
}
num3=fgetc(fp);
while(num3 != '\n') {
B2=B2*10+num3-'0';
num3=fgetc(fp);
}
}
return 0;
}</span>