第3次实验-运用数组编写程序-7-2出生年

题目描述

以上是新浪微博中一奇葩贴:“我出生于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;
posted @ 2021-10-30 23:00  羽错光阴  阅读(104)  评论(1编辑  收藏  举报