给定任意一个正整数,求比这个数大且最小的“不重复数”

本文介绍了解决寻找不重复数问题的两种算法。第一种算法通过逐位检查并修正重复数字来寻找最小的不重复数。第二种算法则通过递归地检查高位数是否重复,并据此调整数值来寻找目标不重复数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两种解法:


第一种:

算法:


1、把整数放到字符数组里面去,从高位为低位(用变量i)扫描,找到重复的数位,重复数位为“99”跳到第2步,否则跳到第3步,若没有重复的数位,则该数为不重复数,返回;


2、遇到“99”的重复数,则把“99”改为“00”,然后在“99”前面一位字符加1,把扫描的地方定位在“99”往高位方向的第2位,比如是1299,变换后为1300,然后把扫描变量 i 定位在1这一数位上,返回第1步;


3、遇到非“99”的重复数,则直接在低位加1,后面依次变为010101……,结果就是最小的不重复数,返回改值;


第二种:


问题的提法:

  为代码简便,将问题等价地改为,求大于等于指定正整数的不重复数。由find()函数实现。

调用:

  find( i + 1u )

原型:

  unsigned find( unsigned );

算法:

  以19922884u为例。

  首先确定高位是否是重复数。即依次判断

1u

19u 

199u

1992u

19922u

199228u 

1992288u

 是否是重复数。

  如高位不是重复数,则当前数不变,并判断当前数是否是重复数。

  例如对19u,由于1u不是重复数(一位正整数不是重复数,是显而易见的事。(if ( n < 10u ) return n;),所以判断19u是否是重复数(通过简单地判断19u的个位和十位是否相同。n % 10u == n /10u %10u)。

  当当前数为199u时,高位(19u)不是重复数,当前数本身(119u)是重复数。

  此时,将当前数加1,问题变为求大于等于200u的不重复数。

  由于200u的高位不是重复数,而200u本身是重复数,所以经过了

n:2

n:20

之后,问题变成了求大于等于201u的不重复数。

  201u不是重复数,所以回到求大于等于1992u的不重复数时,由于对于1992u来说,由于高位是重复数(返回值大于1992u/10u。 if ( n/10u <(t = find( n/10u)) )n = t * 10;),所以问题变成了求2010u的不重复数(n = t * 10;)。

  2010u是不重复数,求大于等于19922u的不重复数变成了求大于等于20100u的不重复数。

  但由于20100u的高位不是重复数,20100u本身是重复数(个位和十位相同),所以问题又变成了求大于等于20101u的不重复数的问题( if ( n % 10u == n /10u %10u ) return find( n + 1u );)。

  重复以上过程,可得结果为20101010。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值