PTA 团队天梯赛║L1-033 出生年

一、题目要求

355

以上是新浪微博中一奇葩贴:“我出生于 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:

1
1988 4

输出样例 1:

1
25 2013

输入样例 2:

1
1 2

输出样例 2:

1
0 0001

二、解题思路

先将输入的整型转换为字符串,并在不足四位的数前面补零,然后用一个数组 a[10] 存储 0~9 在年份中出现的次数,之后从出生年份循环判断 a 中非零元素个数,若与输入的要求不同数字的个数相同,则输出年龄与该年份;若不同,则年龄与年份自加。

三、代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <bits/stdc++.h>
using namespace std;

bool judge(int str, int n)
{
string s = to_string(str);
while(s.length()<4)
{
s = "0" + s;
}
int count = 0;
int a[10] = {0};
for(int i=0; i<s.length(); i++)
{
a[s[i]-'0']++;
}
for(int i:a)
{
if(i!=0) count++;
}
if(count==n) return 1;
else return 0;
}

int main ()
{
int year;
int n, old = 0;
cin >> year >> n;
while(!judge(year,n))
{
old++;
year++;
}
printf("%d %04d",old,year);

return 0;
}

四、反思总结

最后要注意控制输出的时候同样年份不足四位的前面要补全 0。

同时贴上网上一个利用 set 容器实现的方法,更加高效简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<iostream>
#include<set>//set 容器不允许重复
#include<algorithm>

using namespace std;

int main()
{
int y,n;
cin>>y>>n;
set<int> set;
for(int i=y;i<y+130;i++)
{//假设上限为 130,能活到 130 岁

int q=i/1000;//千位
int b=i/100%10;//百位
int s=i/10%10;//十位
int g=i%10;//个位
set.insert(g);
set.insert(s);
set.insert(b);
set.insert(q);
if(set.size()==n)
{//满足条件时退出
printf("%d %04d\n",i-y,i);
break;
}
set.clear(); //清空容器,方便下一次数据读入
}
return 0;
}