题目描述
输入一个正整数,显示出该整数中重复出现的数字。如果没有重复出现的数字,则输出提示信息“No repeated numbers.”。如果输入不合法,输出“Invalid input”。
输入
一个不超过7位的正整数
输出
重复出现的数字,若有多个重复出现的数字,按从小到大的顺序依次输出,各数字之间用一位空格分隔
样例输入
282112
样例输出
1 2
这道题费了将近一晚上终于过了(可能因为我太菜),最后到头来发现代码没有很长,而且我用的是笨办法(偏枚举),但这道题坑点还是很多的,最后几个点没过去,读题后发现每个临界或细节,这道题都专门设了一个样例,坑坑坑。所以还有很大进步空间。
看题解:
#include<stdio.h>
int a[100],b[10];
int sum;
int c,k;
int main(){
int i,j;
scanf("%d",&c);
if(c >= 10000000 || c <= 0){
printf("Invalid input");
return 0;
}
do{ //抽数字
b[c%10]++; //记次数
}while((c=c/10) != 0);
if(b[0] <2 && b[1] <2 && b[2] <2 && b[3] <2 && b[4] <2 && b[5] <2 && b[6] <2 && b[7] <2 && b[8] <2 && b[9] <2)
printf("No repeated numbers.");
for(i=0;i<10;i++){
if(b[i] >= 2){
printf("%d ",i);
}
}
}
我最后没有改我最初枚举的做法是因为这道题我一开始是这么想的,要顺着自己的想法做出来,才会更有感觉。可能再过几年回过头看自己大一这道题用了这么个枚举方法也会觉得自己当时……
通过这道题可以学到的:
1.数字转化成数组
while(n != 0){
int t=n%10;
a[len--]==t;
n/=10;
}
2.数组转化成数字
for(i=0;i<len;i++){
n=n*10+a[i];
}
return n;
3.抽数字算次数(如代码)有比压牌那道题的感觉了
我自己在做的时候几个问题与坑:
1.输入不合法这个条件限制了这个数的上界与下界大于 0 小于 10000000 ;
2.由于b数组记的是每个数字出现的次数,所以没有重复出现的标准是 b[i] < 2 , 而不是b[i] == 0;
3.一开始想的是因为要按从小到大的顺序排列输出来,我用了冒泡排序,显然多此一举;一开始没有看清题,以为从小到大指的是次数,但其实题上说的是那个数,由于b数组本来就是从0到9遍历的,所以就不用排序了。
题挺好,我挺菜~