输入正整数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尝试
样例输入:
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,然后就是一个错误