/*************************************************************
* file:get_min_nonrepeat_num.c
* brief:求比给定正整数N的最小“不重复数”
* yejing@2015.1.24 1.0 creat
*************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
void swap(int* x, int* y){
if(!x || !y)
return;
int tmp = *x;
*x = *y;
*y = tmp;
return;
}
/*
求比给定正整数N的最小“不重复数”,不重复数指相邻两位的数字不重复。
求解算法思想:对于一个正整数N,从高位开始对对于第二个重复数加1,需考虑是否产生进位
之后如果仍然有重复数,做0101替换处理。因为高位已经加1,低位最小的非重复数只能是0101...
当然如果产生进位,因为要消除重复,进位只出现99的序列里,这降低了回溯的难度,单独处理即可
*/
int get_min_nonrepeat_num(int n){
int need_add_high_bit = 0;
int len = 0;
int tmp[128];
int i = 0;
int repeat_count = 0;
char prev_bit = 0;
//将整数n存到数组tmp中
while(n){
tmp[len++] = n%10;
n = n/10;
if(len > 128){
printf("buffer is insufficent \n");
return 0;
}
}
//将数组顺序调转过来,直观些,比较便于理解
while(i < len/2){
swap(&tmp[i], &tmp[len - 1 - i]);
i++;
}
for(i = 0; i < len; ++i){
//找到一个重复
if(prev_bit == tmp[i]){
if(++repeat_count == 1){//第一个重复数做加1处理
if(prev_bit == 9){//处理产生进位的情况
if(i == 1)
need_add_high_bit = 1;
else
tmp[i - 2]++;
tmp[i - 1] = 0;
tmp[i] = 1;
}
else
{
++tmp[i];
}
}
else{//
if(i%2)
tmp[i] = 1;
else
tmp[i] = 0;
}
}
else
{
repeat_count = 0;
prev_bit = tmp[i];//update prev_bit
}
}
if(need_add_high_bit)
n = 1;
else
n = 0;
for(i = 0; i < len; ++i){
n = n*10 + tmp[i];
}
return n;
}
int main(int argc, char** argv){
int n = 999;
printf("n = %d and the min_nonrepeat_num = %d \n", n, get_min_nonrepeat_num(n));
return 1;
}
求比给定正整数N的最小不重复数(度娘)
最新推荐文章于 2024-11-15 00:55:15 发布