码迷,mamicode.com
首页 > 其他好文 > 详细

OJ-2(数字处理)

时间:2014-09-04 22:16:40      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   for   数据   div   代码   sp   

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~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 numTemp ;
    if(data/10) {
        num++;
        return getBitNum(data/10);
    }
    else {
        numTemp = num;
        num = 1;
        return numTemp;
    }
}

//程序入口
int main()
{
    long int data = 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(数字处理)

标签:style   blog   color   io   for   数据   div   代码   sp   

原文地址:http://www.cnblogs.com/hushunfeng/p/3956854.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!