求比给定正整数N的最小不重复数(度娘)

来源:互联网 发布:淘宝里怎么发布宝贝 编辑:程序博客网 时间:2024/05/16 07:55
/************************************************************* * 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;elsetmp[i - 2]++; tmp[i - 1] = 0;tmp[i] = 1;}else{++tmp[i];}}else{//if(i%2)tmp[i] = 1;elsetmp[i] = 0;}}else{repeat_count = 0;prev_bit = tmp[i];//update prev_bit}}if(need_add_high_bit)n = 1;elsen = 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; }

0 0
原创粉丝点击