L1-033 出生年
题目链接-L1-033 出生年
输入样例1:
1988 4
输出样例1:
25 2013
输入样例2:
1 2
输出样例2:
0 0001
解题思路
STL set
- for循环从y遍历到3012,直到找到符合条件的为止
- 因为y的范围为1-3000,最坏的情况就是y=3000,n=4时,所以3012是极限了
- 利用STL里的
set
容器储存 i 的每一位,因为set
容器里不能有相同元素,所以当set.size()==n
时就说明数字 i 有n个不相同的数字,即 i 满足条件 - 因为年份为四位数且数字中可能存在前导0,所以取每一位数字时用
for(int j=0;j<4;j++)
,执行4次 - 最后输出的时候用了
setw()函数
和setfill()
函数
主要讲讲这两个函数的做法和作用:
1. setw()
函数仅对<<后的输出数据有效,setfill()函数则是跟在setw后面填充相应的空位
2. setfill()
跟着setw()
函数才有输出结果,且setw()
只能一次有效,setfill()
则永久有效,直到遇到下一个setfill()
函数
3. setfill() 的参数只能是 <char>
,setw(int n) n表示域宽,当后面输出的数据长度不够n时就用 setfill()
里的char字符补满
4. setfill()
和 setw()
在的头文件是<iomanip>
5. 在 setfill()
与输出的数据之间加left
或right
分别表示向左或向右补齐
其实输出时直接可以用printf("%04d",i);
就可以起到一样的作用,嘻嘻
附上代码
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e5+5;
typedef long long ll;
typedef pair<int,int> PII;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int y,n;
cin>>y>>n;
for(int i=y;i<=3012;i++){
set<int> s;
int num=i;
for(int j=0;j<4;j++){
s.insert(num%10);
num/=10;
}
if(s.size()==n){
cout<<i-y<<" "<<setw(4)<<setfill('0')<<right<<i;
break;
}
}
return 0;
}