最小不重复数

2014百度笔试题目:

1、给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数。

解法:

  思路,1、检测是否是重复数,

     2、如果不是重复数,进行++判断,是重复数,递归

               不是重复数,找到,返回。

     3、是重复数,从第一次出现重复的位置,相同的数字第二个,做加一。

               如19900,第二个9+1,为20000;递归

                (最初考虑有错,考虑999,第一次得到1009,递归得到1019!!!!)需要减去重复位以后的数,即后面全变为0;

 1 #include<stdio.h>
 2 int minrepeatnum(int n,int flag)
 3 {
 4     int bit = 0;
 5     int tmp = n;
 6     int prev = -1;
 7     int cur;
 8     int lastbit = -1;
 9     prev = tmp % 10;
10     
11     //获取位数最高的重复数字
12     while((tmp = tmp/10) != 0){
13         cur = tmp % 10;
14         if(cur == prev)
15             lastbit = bit;
16         prev = cur;
17         bit++;
18     }
19     //如果用户输入的数字即为非重复数,则+1继续检测
20     //如果递归内部得到的数字为非重复数,直接返回即可
21     if(lastbit == -1 && flag == 0)
22         return n;
23     if(lastbit == -1 && flag == 1){
24         return minrepeatnum(n+1,0);
25     }
26     bit = lastbit;
27     tmp = 1;
28     
29     //将从最高位开始得到重复数字位+1,并将其后各位置0
30     while(bit > 0){
31         tmp *= 10;
32         bit--;
33     }
34     n = n + tmp - n%tmp;
35     return minrepeatnum(n,0);
36 }
37 int minrepeat(int n)
38 {
39     return minrepeatnum(n,1);
40 }
41 void main()
42 {
43     int n;
44     while(1){
45         printf("input n = ");
46         scanf("%d",&n);
47         printf("minrepeatnum = %d\n",minrepeatnum(n));
48     }
49 }

 

 

 

 

 

转载于:https://www.cnblogs.com/xiaoerhei/p/3679140.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值