关于#C语言#的问题,如何解决?

L1-033 出生年
分数 15
作者 陈越
单位 浙江大学

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

为什么我的代码不是满分,麻烦帮我指出一下问题在哪

img

#include 
int main()
{
    int y,n,count=0,x,a[10]={0},m;
    int i;
        
    scanf("%d%d",&y,&n);
    
    while(1)
    {
        int t;
        t=y;
        for(i=0;i<4;i++)
        {
            a[t%10]++;
            t=t/10; 
        }

    
         m=0;
        for(i=0;i<10;i++)
        {
            if(a[i]==1)
             m++;
        }
        
        if(m+1==n)
        {
             printf("%d %04d",count,y);
             break;
        }
         
         
        if(m==4)
        {
             printf("%d %04d",count,y);
             break;
        }
        
        for(i=0;i<10;i++)
         a[i]=0;
         
        y++;
        count++;
    }
    
    return 0;
}


23行的条件改为a[i]>=1;
27行的条件改为m==n;
34行到38行删掉。
修改前执行结果:

img


修改后执行结果:

img


修改后完整代码:

#include <stdio.h>
int main() {
    int y, n, count = 0, a[10] = {0}, i, m, t;
    scanf("%d%d", &y, &n);
    while (1) {
        t = y;
        for (i = 0; i < 4; i++) {
            a[t % 10]++;
            t = t / 10;
        }
        m = 0;
        for (i = 0; i < 10; i++) {
            if (a[i] >= 1)
                m++;
        }
        if (m == n) {
            printf("%d %04d", count, y);
            break;
        }
        for (i = 0; i < 10; i++)
            a[i] = 0;
        y++;
        count++;
    }
    return 0;
}

这道题我是用了c++中#include"algorithm"库里面的
sort和unique函数,一个是排序,一个是去重(判断有几个不同的数字),一定要先排好序,再去去重,否则会出错,(我也不知道为什么,我之前没有加排序的那一行代码,就是错的,但是我逻辑上是说得通的)

#include<iostream>
#include<stdio.h>
#include<algorithm>//int index = unique(v.begin(),v.end) - v; 
using namespace std;

int main()
{
    int y,y_copy,begin,n;
    int x;
    int count = 0;
    int num[4],num_copy[4];
    
    cin>>y>>n;
    begin = y_copy = y;
    while(1)
    {
        for(int i=3;i>=0;i--)//将每个位取出来 
        {
            if(y)
            {
                num_copy[i] = num[i] = y%10;
                y = y/10;
            }
            else
                num_copy[i] = num[i] = 0;
        }
        sort(num,num+4);
        int index = unique(num,num+4) - num;//去重函数 
//        printf("index = %d num = ",index);
//        for(int i=0;i<index;i++)
//            printf("%d",num[i]);
//            printf("\n");
        if(index == n)//找到满足条件的年份 
        {
            printf("%d ",y_copy - begin);
            
            for(int i=0;i<4;i++)
            printf("%d",num_copy[i]); 
            
            break;
        }
        y = ++y_copy; //下一个年份 
    }
    return 0;
}





应该是限制范围出问题,
//应该要加入限制条件吧
//年份1-3000,n只能是 2/3/4
因为你的输入年份超过范围也照样处理,个人认为是这个问题

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^