458. 比例简化
在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。
例如,对某一观点表示支持的有1498人,反对的有902人,那么赞同与反对的比例可以简单的记为1498:902。
不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意。
因为这个比例的数值太大,难以一眼看出它们的关系。
对于上面这个例子,如果把比例记为5:3,虽然与真实结果有一定的误差,但依然能够较为准确地反映调查结果,同时也显得比较直观。
现给出支持人数A,反对人数B,以及一个上限L,请你将A:B化简为A′:B′,要求在A′和B′均不大于L且A′和B′互质
(两个整数的最大公约数是1)的前提下,$\frac{A’}{B’}$ ≥ $\frac{A}{B}$且$\frac{A’}{B’}$ - $\frac{A}{B}$的值尽可能小。
输入格式
输入共一行,包含三个整数A,B,L,每两个整数之间用一个空格隔开,分别表示支持人数、反对人数以及上限。
输出格式
输出共一行,包含两个整数A′,B′,中间用一个空格隔开,表示化简后的比例。
数据范围
$1≤A,B≤106,$
$1≤L≤100,A/B≤L$
输入样例:
1498 902 10
输出样例:
5 3
思路:
题目已经给出了$1≤L≤100$,且要求A′
和B′
均不大于L
。因此可以枚举 A′,B′
的所有组合,然后判断:
A′,B′
是否互质;- $\frac{A’}{B’}$是否大于等于 $\frac{A}{B}$,并且最小
事实上,上述算法可以省去对于 A′,B′
是否互质的判断:
可以举个简单的例子,比如枚举到(10,4)
的时候,那么之前我们肯定已经枚举过了(5,2)
这种组合情况,因为10-4 > 5-2
,所以我们会保留较小的那组(5,2)
,而最小的那组分子分母肯定是互质的。
Java代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int A = sc.nextInt();
int B = sc.nextInt();
int L = sc.nextInt();
int a = 0,b = 1;//保留结果A',B'
double delta = Double.MAX_VALUE;
for(int i = 0;i <= L;i++){//i代表A'
for(int j = 1;j <= L;j++){// //j代表B',而分母不能为0,故从1开始
double x = (double)i / j;//按题意需要变为实数除法
double X = (double)A / B;
if(x >= X && x - X < delta){
a = i;
b = j;
delta = x - X;
}
}
}
System.out.println(a+ " " + b);
}
}