description:
给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含),
指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
思路:
1.将数组A排序.
2.生成一个十个数的数组B,B[i]中的每一个的元素都是A中比i大的最小的元素,如果不在A中则用A中所组合而成的最小的两位数代替,比如上例则生成B[]={1, 3, 3, 8, 8, 8, 8, 8, 10, 10}
3.从给定的数最高位开始找到第一不在A中的位数i的权值m, 从第i位开始到最高位找到第一个权值m,B[m] != max(A中组合而成的最小的两位数), 剩下的位都用A[0]代替。
代码如下:
/*
*@用给定的集合产生一个最小的数 *@Author Du wenchong *@Date 2011-09-25 */ #include<stdio.h> #include<stdlib.h> #define N 10 int max = 0; int get_number(int *, int *, int ,int); int is_in(int *, int , int); int main() { int A[] = {1, 3, 5, 7}; int i, j; int *B =NULL; int number = 81; int temp = 0; int result = 0; int count = sizeof(A)/sizeof(int); for (i = 0; i < count -1; i++) { for (j = i ; j < count -1; j++) { if (A[j] > A[j + 1]) { temp = A[j]; A[j] = A[j + 1]; A[j + 1] = temp; } } } if (A[0] != 0) { max = A[0] * 11; } else { max = A[1] * 10; } B = (int *)malloc(sizeof(int)*10); if (!B) { printf("out of space\n"); exit(0); } j = i = 0; while (i < count && j < N) { if (A[i] > j) { B[j] = A[i]; j ++; } else { i++; } } while (j < N) { B[j] = max; j++; } result = get_number(A, B, number, count); printf("the answer is %d\n", result); return 0; } int get_number(int *A, int* B, int number, int count) { int bit = 0; int i = 0; int temp = number; int j, sum; j = sum = 0; while (temp) { bit++; temp /= 10; } int *p = (int *) malloc(sizeof(int)*bit); if (!p) { printf("out of space\n"); exit(-1); } temp = number; i = 0; while(temp) { p[i] = temp % 10; temp = temp/10; i ++; } for (i = bit -1; i > 0; i--) { if (!is_in(A, p[i], count)) { break; } } for (j = i; j < bit; j++) { if (max != B[p[j]]) { p[j] = B[p[j]]; printf("p[%d] :%d\n", j, p[j]); break; } } if (j == bit) { p[--j] = max; } while (--j >= 0) { p[j] = A[0]; } for (i = bit - 1, sum = 0; i >= 0; i--) { sum = sum *10 + p[i]; } free(p); return sum; } int is_in(int *A, int number, int count) { int i = 0; int j = count - 1; int mid = 0; while (i <= j) { mid = (i + j)/2; if (A[mid] < number) { i = mid + 1; } else if (A[mid] > number) { j = mid - 1; } else { return 1; } } return 0; }