首页 > 代码库 > 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(数字处理)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。