L1-033. 出生年(Java)PAT团体程序设计天梯赛-练习集

这里写图片描述
以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。

输入格式:

输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在[1, 3000]之间,n可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。

输出格式:

根据输入,输出x和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。

输入样例1:

1988 4

输出样例1:

25 2013

输入样例2:

1 2

输出样例2:

0 0001


import java.util.Scanner;

public class Main {

    // 判断 year(最多4位数)是否恰好有n个数字不同,n可以是2, 3, 4
    public static boolean isX(int year, int n) {
        // 标记数字是否出现
        int[] dif = new int[10];
        int sum = 0;
        int i = 0;

        // 分割数字
        while (year > 0) {
            int k = year % 10;
            year /= 10;

            // 分割出数字 k,次数加 1
            dif[k]++;

            // 如果是第一次出现,则不同的数字个数加一
            if (dif[k] == 1) {
                sum++;

                // 如果不同的数字个数大于n,不符合要求,退出
                if (sum > n) {
                    return false;
                }
            }

            // 总的数字个数加一
            i++;
        }

        // 如果总数字个数小于4,且数字 0 没有出现过
        // 则补0, 0出现次数加一
        if (i < 4 && dif[0] == 0) {
            sum++;
        }

        // 如果不同数字个数恰好等于  n,则返回  true
        if (sum == n) {
            return true;
        }

        return false;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int y = scanner.nextInt();
        int n = scanner.nextInt();
        int i = 0;

        // 直到找到一个年份符合要求的年份
        while (!isX(y + i, n)) {
            i++;
        }

        System.out.printf("%d %04d", i, (y + i));
    }
}

猜你喜欢

转载自blog.csdn.net/qq_34732088/article/details/79804999