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

本文介绍了一种求解比给定正整数N小的最小“不重复数”的算法。不重复数定义为相邻两位数字不相同的数。文章详细阐述了算法思想,并通过实例演示了如何实现该算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*************************************************************
 * 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;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值