zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    diary and html 文本颜色编辑,行距和其它编辑总汇
    bash coding to changeNames
    virtualbox ubuntu 网络连接 以及 连接 secureCRT
    linux 学习6 软件包安装
    linux 学习8 权限管理
    vim 使用2 转载 为了打开方便
    ubuntu
    linux 学习15 16 启动管理,备份和恢复
    linux 学习 14 日志管理
    linux 学习 13 系统管理
  • 原文地址:https://www.cnblogs.com/hushunfeng/p/3956854.html
Copyright © 2011-2022 走看看