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 }