Problem  Description:

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

Input:

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

Output:

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

Sample  Input 1:

1988 4

Sample  Output 1:

25 2013

Sample  Input 2:

1 2

Sample  Output 2:

0 0001

思路:这道题用set 函数会比较简单,因为set函数主要用于集合中,我们可以把年份当作一个集合,而年份的每一位数当作是集合里面的每个元素,set 函数的特点就是会把集合里面的元素进行去重和排序,我们在这道题中就用到了去重。集合里面有几个元素就代表着年份中有几个不同的数字。

My  DaiMa:

#include<stdio.h>
#include<iostream>
#include<set>
#include<iomanip>
using namespace std;
int fun(int n)
{
    set<int> s;
    int a,b,c,d;
    a=n%10;
    b=(n/10)%10;
    c=(n/100)%10;
    d=n/1000;
    s.insert(a);
    s.insert(b);
    s.insert(c);
    s.insert(d);  //先将每个元素插入集合中,然后利用set函数进行去重
    return s.size();  //最后返回集合中元素的个数,即年份中不同数字的个数
}
int main()
{
    int year,m;
    cin>>year>>m;
    int n=0;
    while(fun(year)!=m)
    {
        year++;
        n++;
    }
    cout<<n<<" ";
    printf("%04d",year);  //这里用到了一个小技巧,“%04d”的意思就是不足4个宽度时,在前面添0
    return 0;
}