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;
}