(笔试题)最小的非“重复的数”

题目:

给一个定义:对一个整数,若其中存在相邻两位上的数字相同,则称其为“重复的数”;现给定一个正整数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;
}

  

posted @ 2015-08-18 22:45  AndyJee  阅读(446)  评论(0编辑  收藏  举报