Nwafu-oj 重复数字

题目描述

输入一个正整数,显示出该整数中重复出现的数字。如果没有重复出现的数字,则输出提示信息“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遍历的,所以就不用排序了。

题挺好,我挺菜~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

511511511

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值