PTA团体程序设计天梯赛—练习集—L1-033 出生年 (15 分)【C / C++ / Python】

L1-033 出生年 (15 分)

*文章提供者:海南师范大学 ---- 人工智能教育协会 ---- 赵雨辰、张语晨

(一)题目要求

在这里插入图片描述
以上是新浪微博中一奇葩贴:“我出生于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

(二)代码如下:

方法一:(C)

#include<stdio.h>
int main()
{
	int a[4];
	int i,n,k=1,year,j;
	scanf("%d%d", &year,&n);
	for(i=year;i<=10000;i++){
		k=1;
		a[0]=i/1000;a[1]=i/100%10;a[2]=i/10%10;a[3]=i%10;
		if(a[0]!=a[1]&&a[0]!=a[2]&&a[0]!=a[3]){
			k++;
		}if(a[1]!=a[2]&&a[1]!=a[3]){
			k++;
		}if(a[2]!=a[3]){
			k++;
		}if(k==n){
			break;
		}
	}
	printf("%d %04d",i-year,i);
	
	return 0;
 }

方法二:(C++)

#include<bits/stdc++.h>
using namespace std;

int main(void){
	// year用于遍历,count用于计数 
	int year, n, count=0;
	
	cin >> year >> n;
	// 第一层for循环,从year开始向后遍历,直到找到满足n条件的年份出现 
	for(int s_n=0; s_n!=n; year++, count++){
		// s_year用于计算,不改变year
		// save用于统计当前year的各位数字 
		int s_year=year, save[10]={0};
		
		// 第二层遍历用于统计各位数字 
		for(s_n=0; s_year!=0; s_year /= 10){
			// 新数字出现,s_n+1 
			if(save[s_year%10]++ == 0){
				s_n++;
			}
		}
		// int型没有前导0,所以对1000以下的数字需要增加对0的判断 
		if(year<1000 && save[0]==0){
			s_n++;
		}
	}
	
	// 因为是用for循环遍历的,所以遍历结果需要-1 
	printf("%d %04d", --count, --year);
	
	return 0;
} 

方法三:(Python)

# split将input的两个数字分割,map将其成整形
year, n = map(int, input().split())

# for循环将year向后遍历
for s_year in range(year, 9999):
    # 字典用于表示不同数字的统计,不用列表的原因是它还得加是否拥有该元素的判断
    save = {}

    # 遍历数字统计
    for i in str(s_year):
        save[i] = 1
    # 4位数以下添加对前导0的判断
    if s_year < 1000:
        save['0'] = 1
    # 满足位数要求即输出
    if len(save) == n:
        print("{} {:04d}".format(s_year-year, s_year))
        break

诚挚希望有心者指正,渴望简单的方法。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值