C++:出生年(团体程序设计天梯赛)

题目概述:
输入格式:
输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在[1, 3000]之间,n可以是2、或3、或4。
输出格式:
根据输入,输出x和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。
编程:
#include< iostream>
using namespace std;
int bijiao(int n)
{
int a[10] = { 0 }, max = 0;
while(1)
{
a[n % 10]++;
n = n / 10;
if (n == 0)
break;
}
for (int i = 0; i < 10; i++)
{
if (a[i] > 0)max++;
}
return max;
}
int main()
{
int y, n, t;
cin >> y >> n;
t = y;
while (1)
{
if (bijiao(y) == n)
break;
y++;
}
cout << y - t << " " << y << endl;
return 0;
}
上机实践:
在这里插入图片描述

### 回答1: 用一个空格隔开,年份输出4位,不足4位的在前面补零。如果无法达到要求,则输出"Impossible"。 输入样例11988 4 输出样例1: 25 2013 输入样例2: 2000 3 输出样例2: 10 2013 输入样例3: 2018 2 输出样例3: Impossible #思路 1. 首先判断输入年份y是否满足要求,如果不满足要在前面补零,使其成为4位数。 2. 从y+1开始,每次循环判断该年份是否满足n个数字都不相同的要求,如果满足则输出该年份x(x为该年份减去y),并结束程序。 3. 如果循环到了3000还没有找到符合要求的年份,则输出"Impossible"。 ### 回答2: 对于这道题,可以用程序自动计算出满足要求的年份。由于要求“不同数字个数”只能是2、3或4,因此可以分三种情况进行讨论。 (1)当n=2时,说明目标年份中只有两个数不同。因此可以从出生年份y开始向后遍历年份,直到发现两个数不同年份为止。具体做法是逐位比较年份的每一位数字,如果有两位不同,就可以输出该年份遇到该年份时的龄。 (2)当n=3时,说明目标年份中只有三个数不同。同样可以从出生年份y开始向后遍历年份,每次检查当前年份数字是否不同。为了提高效率,可以先将当前年份转换成字符串,然后再逐位比较。如果发现当前年份中有三个数不同,就可以输出该年份遇到该年份时的龄。 (3)当n=4时,说明目标年份中所有数字不同。这种情况下可以采用暴力枚举的方法,从出生年份y的下一开始向后尝试每一个年份,直到找到符合要求的年份为止。具体做法是先将当前年份格式化为4位数,然后将每位数字提取出来进行比较。如果当前年份中所有数字都不相同,就可以输出该年份遇到该年份时的龄。 下面是完整的Python代码实现: ### 回答3: 本题可以使用暴力枚举的方法解决。从出生年份y开始,每增加1,直到找到符合要求的年份。 具体实现时,可以使用一个函数isDifferentYear(year, n),判断年份year是否满足n个数字都不相同的条件。对于一个四位数的年份,可以将其转换为一个由四个数字组成的字符串,然后判断其中有多少个是不同的。 在主函数中,从y开始循环,每次调用isDifferentYear()函数来判断当前年份是否符合要求。如果符合要求,则输出当前年份x(即当前年份出生年份y之间的差值),并终止循环。 以下是参考代码:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值