洛谷-UVA10976 分数拆分 Fractions Again?!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

输入输出样例
输入 #1 复制
2
12
输出 #1 复制
2
1/2 = 1/6 + 1/3
1/2 = 1/4 + 1/4
8
1/12 = 1/156 + 1/13
1/12 = 1/84 + 1/14
1/12 = 1/60 + 1/15
1/12 = 1/48 + 1/16
1/12 = 1/36 + 1/18
1/12 = 1/30 + 1/20
1/12 = 1/28 + 1/21
1/12 = 1/24 + 1/24


思路:1/k = 1/x+1/y ,当x=y ,他们都取2k,1/k = 1/2k+1/2k,如果x >2k ,y 必须更小,即y < 2k, y一直不能取到k,我们只需要检查 y 的取值范围,即 在[k+1,2k] 进行暴力枚举。如何计算x 呢? 1/x = 1/k - 1/y = (y-k) / (ky), x = ky / y-k.

#include<cstdio>
#include<vector>
using namespace std;
int main(){
	int k;
	while(scanf("%d",&k) == 1 && k){
		vector<int> X,Y;
		for(int  y = k + 1; y <= k * 2; y++){//y一直不能取到k,我们只需要检查 y 的取值范围,即 在[k+1,2k] 进行暴力枚举
			 // 1/k = 1/x + 1/y => x = ky/(y-k)
			 if(k*y%(y-k) == 0)
			 {
			 	X.push_back(k*y/(y-k));
			 	Y.push_back(y);
			 }
		}
		printf("%d\n",X.size());
		for(int i = 0 ; i < X.size(); i++)
		printf("1/%d = 1/%d + 1/%d\n", k , X[i],Y[i]);
	}
		
	return 0;
} 
发布了430 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zqhf123/article/details/105394881
今日推荐