题目:
给一个定义:对一个整数,若其中存在相邻两位上的数字相同,则称其为“重复的数”;现给定一个正整数n,求不小于n的最小的非“重复的数”。
思路:
假设输入的数为n,则令m=n,
分别取m的最低两位数字a,b,
判断是否a==b,如果是说明是重复的数,那么递归调用n=m+1;考虑特殊情况,ab=99,产生进位后100仍未重复数,此时应该递归调用n=m+2;
如果a!=b,则往前挪一位,即m=m/10,直至m/10=0为止,最后返回n。
该思路也可以通过非递归来实现,详见代码。
代码:
#include <iostream> using namespace std; int calNonRepetitionNum(int n){ if(n<10) return n+1; int a,b; int base=1; int m=n; while(m/10) { b=m%10; a=m/10%10; base*=10; if(a==b) { if(a==9) return calNonRepetitionNum((m+2)*base/10); else return calNonRepetitionNum((m+1)*base/10); } m/=10; } return n; } int calNonRepetitionNum_2(int n){ if(n<10) return n+1; int a,b,m; int base; bool flag=true; while(flag){ flag=false; m=n; base=1; while(m/10){ a=m%10; b=m/10%10; base*=10; if(a==b){ if(a==9){ n=(m+2)*base/10; flag=true; break; } else{ n=(m+1)*base/10; flag=true; break; } } m=m/10; } } return n; } int main() { cout << calNonRepetitionNum(99) << endl; cout << calNonRepetitionNum_2(88) << endl; return 0; }