UVA 10976 Fractions Again

46 篇文章 1 订阅

分数拆分 Fractions Again?!

题面翻译

输入正整数k,找到所有的正整数 x ≥ y x \ge y xy,使得 1 k = 1 x + 1 y \frac{1}{k}=\frac{1}{x}+\frac{1}{y} k1=x1+y1

Translated by @陶文祥

题目描述

PDF

输入格式

输出格式

样例 #1

样例输入 #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

分析:

首先把题意搞懂:题目就是让我们求出两个整数x,y;使得1/x+1/y=1/n。

咋做呢???
枚举!!!(你们自己去一个个枚举吧,我不会枚举QWQ)

正文
既然我们要求出满足要求的x,y,我们不妨先看看x,y的关系:
x>=y,那我们能不能求出x,y的范围呢???

1/n=1/x+1/y, 1/n=1/(n/2)+1/(n/2)
x,y最大值不能超过n/2
又∵1/n=0+1/n,xy必须为整数
x,y最小值不能小于n+1

总结:n+1≤x,y≤n/2

已经求出了范围,我们就来求求x,y~~
我们再来看看这个方程:1/x+1/y=1/n
左右两边同时乘上一个y得:y/x+1=y/n
左右两边再同时乘上一个n得:y*n/x+n=y
左右两边再~同时乘上一个x得:y*n+n*x=y*x
移项得:y*n=y*x-n*x
合并同类项得:y*n=x*(y-n)

在这个方程中,x的个数只有1个,所以我们可以把x给单独提出来:(y*n)/(y-n)=x

在上文中,我们已经求出了y的范围了,所以我们直接枚举就行啦~~~

代码:

#include<bits/stdc++.h>

using namespace std;

int n;

int x[10000],y[10000];//要求的x,y

int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		int k=0;//即有多少组满足要求的x,y
		
		memset(x,0,sizeof(x));//清空数组
		memset(y,0,sizeof(y));
		
		for(int i=n*2;i>=n+1;i--)//在y的范围里枚举
		{
			if((n*i)%(i-n)==0)//只要x能为整数
			{
				k++;
				
				x[k]=(i*n)/(i-n);//将x存入数组x里
				y[k]=i;//将y存入数组y里
			}
		}
	
		cout<<k<<endl;//按要求输出
		
		for(int i=k;i>=1;i--)//不知道为什么要从后往前输出,开始是从前往后输出的,样例是反着的QAQ
		{
			printf("1/%d = 1/%d + 1/%d",n,x[i],y[i]);
		
			cout<<endl;//换行
		}
	}
	
	return 0;
}

结束啦~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

harmis_yz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值