首页 > 代码库 > OJ-2(数字处理)

OJ-2(数字处理)

From baiduOJ

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

 

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

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

         (3)当判断出原始数据本身就不存在“重复的两位”时,原始数据+1,但需要再一次判断是否会出现“重复的两位”,如果出现,再次+1

代码如下:

#include <stdio.h>#include <math.h>int num = 1;//取出一个数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~9void setElem(int *pdata, double i, int newNum) {        *pdata += (int)pow(10.0,(i-1))*(newNum-getElem(*pdata,i));}//计算出一个整数的位数(个位/十位/百位……)int getBitNum(int data) {    int numTemp ;    if(data/10) {        num++;        return getBitNum(data/10);    }    else {        numTemp = num;        num = 1;        return numTemp;    }}//程序入口int main(){    long int data = http://www.mamicode.com/99921;     int flag = 0;    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);                    }                                    }        }    }        //判断flag是否为0,表明原始数据并不存在重复数    //data加1    if (flag==0) {        data += 1;    }    //data+加1后再次判断是否可能存在重复数    //此时的重复数只可能存在在最低两位    if (getElem(data, 1) == getElem(data,2)) {        data += 1;    }    printf("%ld",data);    return 0;}

 

OJ-2(数字处理)