题目:
以上是新浪微博中一奇葩贴:“我出生于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
解答:
题目分析:
- 我们要求的是直到
x
岁才遇到n
个数字都不相同的年份 - 需要写一个判断每一年有多少个不同数字的函数
- 所谓“
n
个数字都不相同”是指不同的数字正好是n
个 - 输出时不足4位的年份要在前面补零
操作实现:
- 输入当前年份year和期望n个数字都不相同的年份
- 定义count计数需要经过多少年
- 定义函数function,返回当前年份有多少位不同的数字
- 只要function(year++)!=n,那么就进行year++和count++,直到function(year++)==n时跳出循环,此时count为所求值,year比所求year多1
- 按要求输出,使用%04d
代码实现:
#include <iostream>
#include <cstdio>
using namespace std;
int function(int year);
int main()
{
int year, n; cin >> year >> n; //输入year和n
int count = 0; //定义计数变量count并初始化为0,用来计数需要的年份
//只要当前年份不同数字个数不等于n,就进入下一年,并进行count++
while(n != function(year++)) count++;
printf("%d %04d", count, year-1); //按要求规格化输出
return 0;
}
int function(int year) //传入参数当前年份year
{
int arr[4]; //定义数组arr[]来存储year的千位百位十位和个位数字
arr[0] = year / 1000; //求出千位
arr[1] = year / 100 % 10; //求出百位
arr[2] = year / 10 % 10; //求出十位
arr[3] = year % 10; //求出个位
int n = 0; //当前年份有n个不同的数字
///循环遍历数组并两两比较,只要后面出现和前面一样的数字,就将后面的数字修改为-1
for(int i = 0; i < 3; i++)
{
for(int j = i+1; j < 4; j++)
{
if(arr[i] == arr[j]) arr[j] = -1;
}
}
//遍历数组,每出现一个非负数则说明这个数字是不同的,进行n++计数
for(int i = 0; i < 4; i++) if(arr[i] >= 0) n++;
//返回n
return n;
}
PTA题目地址
欢迎大家探讨