困惑
题主初写时将y作为字符串然后补齐了零,但是判断不同数字个数时只能想到较复杂的办法,找不到足够精简的算法。
柳神代码
#include <cstdio>
#include <set>
using namespace std;
int main() {
int y, n;
scanf("%d%d", &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;
}
柳神注解:对于从y开始一直到3012(因为就算最大值3000,一直检验到3012也满足题意了~后面的就没必要了~),将它的每一位的数字放入集合s里面,因为集合是不允许重复数字的,所以集合s的大小就是当前这个数字的不重复数字的个数~当集合s的大小和n相等时,说明满足题意,输出就好啦~
分析
1、柳神没有跟我一样选择字符串来补齐零,而是直接整形输入,通过set的元素不重复特性来满足题目的需求。
2、
for (int j = 0; j < 4; j++) {
s.insert(num % 10);
num /= 10;
}
这一段将年份各位全部收入set中,同时由于元素不重复特性,使得不足四位的年份在收入后会自动再收入一个0,从而规避了补全前置0的需要。
例如,y为12,运行这段程序后set中会有0,1,2三个元素。
3、
printf("%d %04d", i - y, i);
%4d表示至少输出四位整数,不足则用空格补齐,而%04d意味着不足时会用0而非空格补齐。