基础题1

输入格式:

输入文件包含多组输入数据。

每组数据有三个正整数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>



小生菜鸟一枚,如果有人有兴趣把题也做一下,且复杂度更低的,大家可以交流一下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值