当前位置: 首页 > 图灵资讯 > 技术篇> P1482 Cantor表(升级版)

P1482 Cantor表(升级版)

来源:图灵教育
时间:2023-06-17 13:51:44

cantor表(升级版)题目描述

现代数学的名称证明之一是 Georg Cantor 证明有理数是可枚举的。他用下表证明了这个命题:

这次与 NOIp1999 第一个问题的区别在于:这次需要输入两个分数(不一定是最简单的分数),计算两个分数的积累(注意需要约到最简单的分数),输出积累在原表的第几行(如果积累形状如 P1482 Cantor表(升级版)_洛谷_02(即结果为整数)或 P1482 Cantor表(升级版)_洛谷_03,它被视为表中的 P1482 Cantor表(升级版)_java_04P1482 Cantor表(升级版)_洛谷_03 结算)。

输入格式

共两行。每行输入一个分数(不一定是最简分数)。

输出格式

两个整数,表示输入的两个分数积累在表中的第几列第几行。

样例 #1样例输入 #1
4/55/4
样例输出 #1
1 1
提示数据范围

对于所有数据,两个分数的分母和分子都小于 P1482 Cantor表(升级版)_洛谷_06

思路解析

本题主要考虑以下三点:①如何去掉“/”,得到要操作的数量。②对乘出结果进行约分。③根据约分后的结果,在表中输出位置。

对于①,用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;    }}