L1-033 出生年(c语言)

作者 陈越

单位 浙江大学

L1-033 出生年(c语言)_第1张图片

以上是新浪微博中一奇葩贴:“我出生于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

 

解题思路:

  1. 首先,我们输入两个整数y和n。
  2. 进入一个无限循环(通过while(1)实现)。
  3. 在每次循环中,我们初始化一个变量count为0,用于计算数字的不同位数。同时,我们使用一个标志数组flag来记录数字的出现情况,初始值都为0。
  4. 如果y小于1000,说明千位数为0,我们将flag[0]标记为1,且count加1。
  5. 我们使用变量t来存储y的值,并通过循环遍历t的各个位数。
  6. 对于t的每一位,我们将它对应的flag数组元素标记为1,并将count加1(仅当该位数字之前未出现过时)。
  7. 如果count等于n,意味着y的每一位数字均不相同且出现次数为n,满足题目要求,我们跳出循环。
  8. 否则,我们将年份year加1,将y加1,继续下一轮循环。
  9. 循环结束后,我们输出年份year和四位数形式的y。
#define _CRT_SECURE_NO_WARNINGS 1
#include 

int main()
{
    int y, n, year = 0;
  
    // 输入y和n
    scanf("%d %d", &y, &n);
    
    while (1)
    {
        int count = 0;
        int flag[10] = { 0 };
        
        if (y < 1000)
        {
            flag[0] = 1;
            count++;
        }
        
        int t = y;
        
        // 计算y的每一位数字的出现次数
        while (t)
        {
            int s = t % 10;
            
            if (flag[s] == 0)
            {
                flag[s] = 1;
                count++;
            }
            
            t /= 10;
        }
        
        if (count == n)
        {
            break;
        }
        else
        {
            year++;
            y++;
        }
    }
    
    // 输出年份和四位数形式的y
    printf("%d %04d", year, y);
  
    return 0;
}

 

你可能感兴趣的:(笔记,c语言,开发语言)