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;
}