求比指定数大且最小的“不重复数”问题

给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数.

#include <stdio.h>#include <stdlib.h>#include <errno.h>#define NUMBER_STR_MAX_LENGTH (128)unsigned find(unsigned);int main(void){unsigned num = 0;printf(“Please input Unsigned Number : “);if (scanf(“%u”, &num) != 1) {perror(“input error!”);return 1;}printf(“%u\n”, find(num));return 0;}void str_reverse(unsigned char *str,unsigned length){unsigned char *prv = NULL;unsigned char *cur = NULL;unsigned char swap = ‘\0’;for (prv = str, cur = str + (length-1); prv < cur; ++prv, –cur){swap = *prv;*prv = *cur;*cur = swap;}}unsigned find(unsigned number){unsigned char number_str[NUMBER_STR_MAX_LENGTH] = {‘\0’};unsigned char *prv = NULL;unsigned char *cur = NULL;unsigned char *finded = NULL;unsigned int number_length = 0;unsigned int result = 0;int carry = 0;++number;number_length = sprintf(number_str, “%u”, number);str_reverse(number_str, number_length);for (cur = number_str + (number_length-1), finded = number_str; cur > finded – 1 ; –cur ){if (prv != NULL && *prv == *cur){finded = cur;carry = 1;do {*cur += carry;carry = (*cur – ‘0’) / 10u;*cur = (*cur-‘0’) % 10u + ‘0’;++cur;} while (carry != 0 && cur < (number_str + number_length));if (carry > 0){*cur = ‘0’ + carry ;++number_length;}}prv = cur;}/* set rests as 010101 */for (carry = 0; cur > number_str – 1; –cur){*cur = carry + ‘0’;carry ^= 1u;}str_reverse(number_str, number_length);sscanf(number_str,”%u”,&result);return result;},不会因为别人显赫的成功而促使自己有卓越的进步。

求比指定数大且最小的“不重复数”问题

相关文章:

你感兴趣的文章:

标签云: