标签: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; }
标签:style blog color io for 数据 div 代码 sp
原文地址:http://www.cnblogs.com/hushunfeng/p/3956854.html