OJ-2(数字处理)

From baiduOJ

title:给定N是一个正整数,求比N大的最小“不重复数”,这里的不重复是指没有两个相等的相邻位,如1102中的11是相等的两个相邻位故不是不重复数,而12301是不重复数。

 

思路:(1)将原先的N进行+1,再进行“不重复”检测

     (2)从最高位开始,往低位扫描,一旦发现有重复的两位,相对较低的那位+1,其后面的位数全部变成010101……

         (3)经过(2)之后的一轮后,或许又会产生新的“重复的两位”,需要再次执行(2)过程进行循环扫描,直到没有发现“重复的两位”,跳出循环

         

代码如下:

#include <stdio.h>
#include <math.h>

//取出一个数N的第i位(N的个位为第1位)
int getElem(int data, double i) {

    int res;

    if(i == 1)  res = data%10;
    if(i > 1)   res = (data/(int)pow(10.0,(i-1)))%10;

    return res;
}

//设定一个数N的第i位为newNum,注意newNum只能是0~9
void setElem(int *pdata, double i, int newNum) {

        *pdata += (int)pow(10.0,(i-1))*(newNum-getElem(*pdata,i));
}

//计算出一个整数的位数(个位/十位/百位……)

int getBitNum(int data) {


int bitNum = 0;


while(data) {
  bitNum++;
  data /= 10;
}


return bitNum;


}

//程序入口
int main()
{
    long int N = 99921; 
    long int data = N + 1;

    double i;

    int flagLoop = 1;

    int j;

    while(flagLoop) {
        flagLoop = 0;
        //2位以上的数的处理
        for (i = getBitNum(data); i >= 2; i--) {

                if(getElem(data,i)==getElem(data,i-1)) {

                    flag = 1;
                    flagLoop = 1;
                    
                    setElem(&data,i-1,getElem(data,(i-1))+1);
                    //后面的位数变成010……依次交替
                    for (j = i-2; j >= 1; j -= 2) {

                        setElem(&data,j,0);
                    }

                    for (j = i-3; j >= 1; j -= 2) {
                        setElem(&data,j,1);
                    }
                    
                }

        }

    }
    

    

    printf("%ld",data);

    return 0;
}

 

posted @ 2014-09-04 21:00  痞子胡先生  阅读(672)  评论(0编辑  收藏  举报