题目描述
以上是新浪微博中一奇葩贴:“我出生于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位数字不同的条件。
题解
读题
注意:不足4位的年份要在前面补零
注意:所谓“n个数字都不相同”是指不同的数字正好是n个。
如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。
伪代码:
cin>>now>>n;
age = 0;
.......(一段代码);//判定当年是否满足要求
while(!flag){//flag:记录now是否满足要求
now ++;
age ++;
......(一段代码);//判定now是否满足要求
}
cout<<age<<" "<<now;//这么写是错的,因为如果now=1,必须输出0001;
}
注意下面的赋初值!!!!因为这一段代码需要使用很多次,所以每一次必须清空数组和变量
细说......(一段代码)//要运行很多次
bool Mark[x]:年份中x是否出现
一段代码如下:
for(int i=0;i<=10;i++)
Mark[i]=0;//清空变量 赋初值【重点】
/*now==1999到now==2000:1999--Mark[1]=1,Mark[9]=1,
不清空就会在2000(下标为0,1,2,9的Mark数组值都为1)的时候出问题*/
tmp=now;//把now的值存下来
cnt=0;//赋初值,保证从0开始加
x=0;//记录now是否小于1000,统计now的位数
while(tmp){
Mark[tmp%10]=1;//把最后一个值依次取出 并把它mark数组标记为1 ,表示这个数字出现过
tmp/=10;
x++;
}
if(x<4)Mark[0]=1;//如果now不足4位,则前面一定有0
for(int i=0;i<=9;i++)
if(Mark[i])
cnt++;
if(cnt==n)flag=1;//不能>=
输出补0;//now
tmp=now;
cnt=0;
while(tmp){
tmp/=10;
cnt++;//==3
}
for(int i=1;i<=4-cnt;i++)cout<<0;