暴力破解分数拆分

输入正整数k,找到所有的正整数x≥y,使得1/k=1/x+1/y。
样例输入:
2
12
样例输出:
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,枚举对象自然就是x、 y了。 可问题在于,枚举的范围如何?
从1/12=1/156+1/13可以看出,x可以比y大很多。 难道要无休止地枚举下去?当然不是。 由
于x≥y,有1/x<=1/y ,因此1/k-1/y<=1/y ,即y≤2k。 这样,只需要在2k范围之内枚举y,然后根据y尝试

计算出x即可。

package ppt;


import java.util.Scanner;


public class Demo8 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
int count = 0;
sc.close();
for(int y=1;y<=2*k;y++)
{
if(((k*y)%(y-k)==0)&&(y!=k))
{
count++;
int x=(k*y)/(y-k);
System.out.println("1/"+k+"="+"1/"+x+"+1/"+y);
}
}
System.out.println(count);
}


}

本体一开始有两个变量,而且一开始有一个变量x的取值波动比较大,另一个值y的取值波动比较小,我们想通过固定住一个值之后,再遍历第二个值,于是通过数学方法找出了y的取值范围(k+1,2k),闭区间,然后计算出x,模除和除法,比较麻烦的是遇到了k+1,然后就是一个错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值