cantor表(升级版)题目描述
现代数学的名称证明之一是 Georg Cantor 证明有理数是可枚举的。他用下表证明了这个命题:
这次与 NOIp1999 第一个问题的区别在于:这次需要输入两个分数(不一定是最简单的分数),计算两个分数的积累(注意需要约到最简单的分数),输出积累在原表的第几行(如果积累形状如 (即结果为整数)或 ,它被视为表中的 或 结算)。
输入格式共两行。每行输入一个分数(不一定是最简分数)。
输出格式两个整数,表示输入的两个分数积累在表中的第几列第几行。
样例 #1样例输入 #1
4/55/4
样例输出 #1
1 1
提示数据范围
对于所有数据,两个分数的分母和分子都小于 。
思路解析本题主要考虑以下三点:①如何去掉“/”,得到要操作的数量。②对乘出结果进行约分。③根据约分后的结果,在表中输出位置。
对于①,用String输入,用Split()将字符串以“/”切割成两部分(不含“/”)。代码如下:
String s1 = scanner.next();String[] split1 = s1.split("/");int z1 = Integer.parseInt(split1[0];int f1 = Integer.parseInt(split1[1];String s2 = scanner.next();String[] split2 = s2.split("/");int z2 = Integer.parseInt(split2[0];int f2 = Integer.parseInt(split2[1];
对于②,找到最大公约数进行约分。代码如下:
public static int fun(int z, int f) { int m = z < f ? z : f; for (int i = m; i >= 1; i--) { if (z % i == 0 && f % i == 0) { return i; } } return 1;}
对于③,查看表格,找到规则。
完整代码
import java.util.Scanner;public class P1482 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String s1 = scanner.next(); String[] split1 = s1.split("/"); int z1 = Integer.parseInt(split1[0]; int f1 = Integer.parseInt(split1[1]; String s2 = scanner.next(); String[] split2 = s2.split("/"); int z2 = Integer.parseInt(split2[0]; int f2 = Integer.parseInt(split2[1]; int z = z1 * z2; int f = f1 * f2; int fun = fun(z, f); System.out.println(f / fun + " " + z / fun); } public static int fun(int z, int f) { int m = z < f ? z : f; for (int i = m; i >= 1; i--) { if (z % i == 0 && f % i == 0) { return i; } } return 1; }}