本题涉及到字符串和数字的切换,我在网上看到很多优雅的解法,大家可以进行参考
首先用set函数储存
#include<iostream>
#include<set>
using namespace std;
int main(){
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) {
printf("%d %04d",i-y,i);
break;
}
}
return 0;
}
下面这个set不推荐
#include <iostream>
#include <stdio.h>
#include <set>
using namespace std;
int getNum(string year) {
set<char> cup;
if (year.size() < 4) {
cup.insert('0');
}
for (int i = 0; i < year.size(); i++) {
cup.insert(year[i]);
}
return cup.size();
}
int main() {
int year, num;
cin >> year;
cin >> num;
for (int i = year; ; i++) {
if (getNum(to_string(i)) == num) {
printf("%d %04d", i - year, i);
break;
}
}
return 0;
}
下面是模拟,判断的非常妙
下面这个模拟也可以
#include <iostream>
using namespace std;
int check(int x,int n){
int a[10] = {0};
int cnt = 0;//统计不相同的数字个数
int i = 4;//总共循环4次
while(i--){
if(!a[x%10]++) cnt++;
x/=10;
}
return cnt==n?1:0;//满足条件则返回1,不满足则返回0
}
int main(){
int y,n,cnt;
cin>>y>>n;
cnt = 0;
for(int i=y;;i++){//这里是一个坑,循环截至到3000是错误的
if(check(i,n)){
printf("%d %04d",cnt,i);//输出,不足4为前面补0
return 0;
}
cnt++;
}
return 0;
}
最后一个不推荐,但是这两个函数了解一下,头文件为#include <iomanip> ,setw(int n)用来控制输出间隔,只对紧接着的输出有效,setw()默认填充的内容为空格,可以setfill()配合使用设置其他字符填充。
#include<bits/stdc++.h>
using namespace std;
int y,n,tot;
bool vis[15];
int main()
{
cin>>y>>n;
for(int i=y;i<=9999;i++)
{
memset(vis,0,sizeof(vis));
tot=0;
for(int j=1;j<=1000;j*=10)
if(!vis[i/j%10])tot+=vis[i/j%10]=1;
if(tot==n)return cout<<i-y<<' '<<setw(4)<<setfill('0')<<i<<endl,0;
}
return 0;
}