给定一个集合和一个数找出比这个数大的最小的数

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


原文地址:https://www.cnblogs.com/chonghui1001/p/2190394.html