一、问题描述
以上是新浪微博中一奇葩贴:“我出生于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
二、设计思路
(1)输入出生年份byear和目标年份中不同数字的个数dnum
(2)利用set容器不会重复插入相同元素的特点,将年份中的每个数字插入到set容器中
(3)比较set容器的size()和dnum
(4)若相同,输出当年年份-出生年份和当前年份
三、程序流程图
四、伪代码实现
五、代码实现
1 #include <iostream> 2 using namespace std; 3 #include <iomanip> 4 #include <set> 5 int main() 6 { 7 int byear,dnum; 8 cin>>byear>>dnum; 9 for(int i=byear;;i++) 10 { 11 set<int>s; 12 int num=i; 13 for(int j=0;j<4;j++) 14 { 15 s.insert(num%10); 16 num=num/10; 17 } 18 if(s.size()==dnum) 19 { 20 cout<<i-byear<<' '<<setfill('0')<<setw(4)<<i; 21 break; 22 } 23 } 24 return 0; 25 }
六、总结
(1)set容器不会重复插入相同的元素,可以利用这一特点来统计一个数中不同元素的个数;
(2)setfill(’char‘)和setw(num)配合使用可以设置输出结果的宽度,setfill可以对空白处进行补录字符的操作;
(3)使用setfill和setw函数和setprecision函数需包含<iomanip>头文件;
(4)setprecision()函数可以控制输出结果的保留位数;
例 输出3.1415926
setprecision(5) 结果3.1415;
setprecision (0) 结果3;
setprecision(1) 结果3;
setprecision(2) 结果3.1;