天天看点

分数拆分!!!

问题描述 :

输入正整数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

解题思路 :

首先是确定下来,这个数字的范围,看到这些数字,我想大家一定会找打规律,分数的分母,左边的是成递减的

趋势,右边的是成递增的趋势,而且右边的分母递增的趋势更加的明显而且每次递增都是一定的数字。

我想这一点我不说,也是明白的,小学题目,但是,还是需要推倒一下,方便计算。

1/k = 1/x + 1/y;

1/k - 1/x  = 1/y;

由于 x >= y  所以 1/x <= 1/y

1/k -1/y <= 1/y;

1/k <= 2/y

2k >= y

综上所述 :

2k >= y

y 一定不会超过2*k

这就有了一定的界限,计算起来就很方便了。

尽管推倒了一定的界限,但是等号的右边是两个分数,而且我只能确定一个分数的范围,另一个我不能一个一个测试

吧,使用一直测试的方法是可以的,但是实在是太浪费时间了,所以我们还要进行计算,这就要考察数学底子了。

拿出一组数据进行演示:

1/12 1/156 1/13

在这里就需要一定灵感了,156  =  13*12 / (13-12);

有没有感觉这个式子在那里见过,其实我是在初中的物理课上学到的。

就是两个电阻并联,求这两个电阻的阻值。

其实这有点扯远了,这个式子是可以推出来的。

1/12 - 1/13 = (13-12) / 12 * 13;

但是在使用的时候,由于得出的结果可能不是整数需要自己判断一下,我使用的方法就是先把这个结果强制的转化为

一个int 类型,然后和自身的float 类型进行比较如果一样就可以了,如果如果不一样,是不可以的。

分数拆分!!!

继续阅读