给定N是一个正整数,求比N大的最小“不重复数”,这里的不重复是指没有两个相等的相邻位,如1102中的11是相等的两个相邻位故不是不重复数,而12301是不重复数。
2015-05-14 20:51
471 查看
/* *给定N是一个正整数,求比N大的最小“不重复数”,这里的不重复是指没有两个相等的相邻位,如1102中的11是相 *等的两个相邻位故不是不重复数,而12301是不重复数。 */ #include <stdio.h> unsigned int solve(unsigned int k); unsigned int testify(unsigned int k); int main(void) { unsigned int num; while (1) { scanf("%d", &num); if (num == 0) break; printf("->"); solve(num); } /*testify*/ for ( num = 1; num < 111111; ++num) { if (solve(num) != testify(num)) { printf("num = %u, solve = %u, testify = %u\n", num, solve(num), testify(num)); break; } } return 0; } int is_num(unsigned int k) { if (k < 11) return 1; int first = k % 10; int second; k = k / 10; while (k) { second = k % 10; if (second == first) return 0; first = second; k = k / 10; } return 1; } unsigned int solve(unsigned int k) { char str[100]; int start, end, mark; if (k == 0 || k == (unsigned int)-1) return; ++k; if (is_num(k)) { printf("%d\n", k); return k; } sprintf(str + 1, "%d", k); start = 1; end = 2; while (str[end] != '\0') { if (str[end] == str[end -1]) { if (str[end] == '9') { str[end - 1] = str[end] = '0'; if (end == 2) { start = 0; str[0] = '1'; mark = 1; break; } str[end - 2] = str[end - 2] + 1; end -= 2; } else { str[end] = str[end] + 1; mark = end +1; break; } } else { ++end; } } /*返回整数是为了下面的验证*/ k = 0; for( ; start != mark; ++start) { printf("%c", str[start]); k = 10 * k + str[start] - '0'; } while (str[start++] != '\0') { printf("%c", '0'); k = 10 * k; if (str[start++] != '\0') { printf("%c", '1'); k = 10 * k + 1; } else break; } printf("\n"); return k; } unsigned int testify(unsigned int k){ while (!is_num(++k)) ; return k; }
相关文章推荐
- 程序设计题--给定任意一个正整数,求比这个数大且最小的“不重复数
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[2014百度笔试题]
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[2014百度笔试题]
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”[2014百度笔试题]
- 给定任意一个正整数,求比这个数大且最小的“不重复数”
- (百度笔试题)给定任意一个正整数,求比这个数大且最小的“不重复数”。
- 有一个int型数组,每两个相邻的数之间的差值不是1就是-1.现在给定一个数,要求查找这个数在数组中的位置
- 给定任意一个正整数,求比这个数大且最小的“不重复数”
- 给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串重点空格。 给定一个string stringA和一个string stri
- 最大比例 X星球的某个大奖赛设了M级奖励。每个级别的奖金是一个正整数。 并且,相邻的两个级别间的比例是个固定值。
- 给定一个正整数N,统计从1到N的整数中,出现“1”的个数(11这个数算出现两次)
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 小易喜欢的单词具有以下特性: 1.单词每个字母都是大写字母 2.单词没有连续相等的字母 3.单词没有形如“xyxy”(这里的x,y指的都是字母,并且可以相同)这样的子序列,子序列可能不连续。 例如: 小易不喜欢"ABBA",因为这里有两个连续的'B' 小易不喜欢"THETXH",因为这里包含子序列"THTH" 小易不喜欢"ABACADA",因为这里包含子序列"AAAA" 小易喜欢"
- 给定一个正整数n,找到比n小的完美平方数相加和等于n的最小数目。
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。
- 给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串重点空格。
- 给定一个数,要求输出比它大的最小的非重复数
- 任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432, 一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,
- 给定一个链表,交换每两个相邻节点并返回其头部。