题目:
以上是新浪微博中一奇葩贴:“我出生于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
思路:
取位数(补0)
首先我们需要一个循环,取出输入年份的各个位上的数。最开始声明数组的时候全部预设为0即可;
判断是否符合条件
我们可以设置数组arr[10],来计算各个数出现的次数。然后用嵌套循环来得出结果。外层循环控制j<4用来控制年份的位数,内层循环控制i<10用来遍历0-9得出各个数出现的次数。
然后再设count=0,用循环遍历arr[],若arr[i]>0则count++,代表i这个数出现过。最后得出的count便是题目中要求计算的“年份中不同数字的个数”。
最后再让count做比较即可。若相等则打印,若不相等则再循环。
最外层大循环用来求目标年份
最外层大循环以输入年份为起点,只要不符合条件就自增,直到出现符合条件的年份,即目标年份后。y-k就是题目中的x;而目标年份则需要arr数组输出(为了应对需要补0的情况)
代码
#include<stdio.h>
int main(){
int y,n,m;
scanf("%d %d",&y,&n);
for(int k=y;;k++){
int arr[4]={0};//用来放y的各个位数
int arr1[10]={0};//用来计算数量
//取各个位数
m=k;
for(int i=0;i<4;i++){
arr[i]=m%10;
m/=10;
if(m==0){
break;
}
}
//判断是否符合条件
int count=0;//计算不同的数
for(int j=0;j<4;j++){
for(int i=0;i<10;i++){
if(arr[j]==i){
arr1[i]++;
}
}
}
for(int i =0;i<10;i++){
if(arr1[i]>0){
count++;
}
}
if(n==count){
printf("%d ",k-y);
for(int i=3;i>=0;i--) {
printf("%d",arr[i]);
}
break;
}
}
return 0;
}
标签:count,arr,年份,数字,int,PTA,C语言,一维,输入
From: https://blog.csdn.net/2401_87626632/article/details/143712915