18444 分数拆分

18444 分数拆分

时间限制:2500MS 代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题 语言: G++;GCC;VC

Description

输入正整数k(k<=1000),将1/k变为不少于2项,但不多于3项的1/(xi)之和,xi为正整数,且i表示序号

注:请使用long long

输入格式

多case,一行一个整数k

最后一行是0

输出格式

对每一个case,按等式最右边一项分母,由小到大排序输出满足条件的等式,最右边一项分母相同,则按最右边第二项,依次类推

每一个case完成后,输出一个空行(没有满足的等式时,也要输出该空行)

输入样例

2
3
4
0

输出样例

1/2=1/6+1/3
1/2=1/42+1/7+1/3
1/2=1/24+1/8+1/3
1/2=1/18+1/9+1/3
1/2=1/15+1/10+1/3
1/2=1/12+1/12+1/3
1/2=1/4+1/4
1/2=1/20+1/5+1/4
1/2=1/12+1/6+1/4
1/2=1/8+1/8+1/4
1/2=1/10+1/5+1/5
1/2=1/6+1/6+1/6

1/3=1/12+1/4
1/3=1/156+1/13+1/4
1/3=1/84+1/14+1/4
1/3=1/60+1/15+1/4
1/3=1/48+1/16+1/4
1/3=1/36+1/18+1/4
1/3=1/30+1/20+1/4
1/3=1/28+1/21+1/4
1/3=1/24+1/24+1/4
1/3=1/120+1/8+1/5
1/3=1/45+1/9+1/5
1/3=1/30+1/10+1/5
1/3=1/20+1/12+1/5
1/3=1/15+1/15+1/5
1/3=1/6+1/6
1/3=1/42+1/7+1/6
1/3=1/24+1/8+1/6
1/3=1/18+1/9+1/6
1/3=1/15+1/10+1/6
1/3=1/12+1/12+1/6
1/3=1/21+1/7+1/7
1/3=1/12+1/8+1/8
1/3=1/9+1/9+1/9

1/4=1/20+1/5
1/4=1/420+1/21+1/5
1/4=1/220+1/22+1/5
1/4=1/120+1/24+1/5
1/4=1/100+1/25+1/5
1/4=1/70+1/28+1/5
1/4=1/60+1/30+1/5
1/4=1/45+1/36+1/5
1/4=1/40+1/40+1/5
1/4=1/12+1/6
1/4=1/156+1/13+1/6
1/4=1/84+1/14+1/6
1/4=1/60+1/15+1/6
1/4=1/48+1/16+1/6
1/4=1/36+1/18+1/6
1/4=1/30+1/20+1/6
1/4=1/28+1/21+1/6
1/4=1/24+1/24+1/6
1/4=1/140+1/10+1/7
1/4=1/42+1/12+1/7
1/4=1/28+1/14+1/7
1/4=1/8+1/8
1/4=1/72+1/9+1/8
1/4=1/40+1/10+1/8
1/4=1/24+1/12+1/8
1/4=1/16+1/16+1/8
1/4=1/36+1/9+1/9
1/4=1/18+1/12+1/9
1/4=1/20+1/10+1/10
1/4=1/15+1/12+1/10
1/4=1/12+1/12+1/12

作者 admin
注意 要用long long

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
#include<cmath>

int main(void) {
	long long k;
	while (cin >> k && k) {
		long long x, y, z, p, t;
		for (z = k + 1; z <= 3 * k; z++) {
			//先判断分为两项是否成立   即 1/k 1/y 1/z
			//同理  z范围是 k+1到2k
			//根据等式得到y  如果y是整数 说明成立
			if (k * z % (z - k) == 0 && z <= 2 * k) {
				y = k * z / (z - k);
				//判断前提条件 x>=y>=z
				if(y>=z)printf("1/%lld=1/%lld+1/%lld\n", k, y, z);
			}
			//判断完两项后 判断三项是否成立
			//将 1/z过去  即三项又变成了两项判断  但是k值变了

			//定义p为新的k
			p = k * z / (z - k);
			//这里因为  相除之后可能不是整数  所以会有小数数据丢失
			//那么和上面方法一样遍历,遍历y  从p+1到2p

			//因为这个数据丢失  所以 遍历p+1到2p+1
			//这里逻辑有点问题  暂时还想不到其他算法
			for (y = p + 1; y <= 2 * p + 1; y++) {
				//所以不满足这个条件的y不处理
				//数学运算得到 x 判断是否为整数 如果是整数就输出
				if (y >= z && (k * z * y) % (z * y - k * y - k * z) == 0) {
					//如果为整数 那么赋值给x
					x = ((k * z * y) / (z * y - k * y - k * z));
					//整个三项式子成立条件是  x>=y>=z
					if (x >= y) {
						printf("1/%lld=1/%lld+1/%lld+1/%lld\n", k, x, y, z);
					}
				}
			}
		}
		//遍历完后记得换行
		cout << endl;
	}
	return 0;
}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值