使用 C 语言查找最接近的漂亮数

问题描述:

假设给定两个整数 N 和 K。 一个数字 M 被称为最接近 N 的漂亮数,当且仅当满足同时满足以下两个条件:

  • N ≤ M 。
  • M 的所有数位有不超过 K 种数字。

比方说,当 N = 2021, K = 2 时,最接近 N 的漂亮数 M 就是 2022 ,因为 2022 的所有数位只有两种数字 0 和 2 ,且 N ≤ M 成立。 再比如,当 N = 20210929, K = 3 时,最接近 N 的漂亮数 M 就是 20211000,因为 20211000 的所有数位只有三种数字 0 、 1 和 2,且 N ≤ M 成立。

请你找出最接近 N 的漂亮数 M。

输入

第一行输入一个正整数 T ,表示有 T(1 ≤ T ≤ 10^4) 组测试数据; 随后的 T 行,每行输入两个正整数 N 和 K , N 和 K 之间用空格隔开。 并且对于每组测试数据,我们保证 1 ≤ N ≤ 10^9, 1 ≤ K ≤ 10。

输出

一共 T 行,每一行输出该测试数据的最接近 N 的漂亮数内容:

为了解决这个问题,我们可以按照以下步骤进行操作:

  1. 首先,我们需要编写一个函数来检查一个数字是否是漂亮数。该函数将接受一个整数 M 和一个整数 K 作为参数,然后检查 M 的所有数位是否不超过 K 种数字。如果满足条件,函数将返回 true;否则,返回 false。
#include <stdbool.h>
#include <stdio.h>

bool isBeautiful(int M, int K) {
    int count[10] = {0};  // 用于记录数字出现的次数
    while (M > 0) {
        int digit = M % 10;
        count[digit]++;
        M /= 10;
    }
    int digitCount = 0;  // 记录数字的种类数
    for (int i = 0; i < 10; i++) {
        if (count[i] > 0) {
            digitCount++;
        }
    }
    return digitCount <= K;
}
  1. 然后,我们可以编写一个函数来查找最接近 N 的漂亮数。该函数将接受一个整数 N 和一个整数 K 作为参数,然后从 N 开始递增查找漂亮数 M,直到找到最接近 N 的漂亮数为止。找到漂亮数后,将其保存到一个变量中,然后返回该变量的值。
int findBeautifulNumber(int N, int K) {
    int M = N;
    while (true) {
        if (isBeautiful(M, K)) {
            return M;
        }
        M++;
    }
}
  1. 最后,我们可以根据输入的测试数据,调用上述函数来解决每个测试案例,并输出结果。
int main() {
    int T;
    scanf("%d", &T);
    for (int i = 0; i < T; i++) {
        int N, K;
        scanf("%d %d", &N, &K);
        int M = findBeautifulNumber(N, K);
        printf("%d\n", M);
    }
    return 0;
}

通过以上步骤,我们就可以使用 C 语言编写一个解决该问题的程序。请注意,在实际使用时,你可能需要根据你的编译器和输入输出要求进行适当的修改。


原文地址: https://www.cveoy.top/t/topic/8oW 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录