zoukankan      html  css  js  c++  java
  • 给定一个集合和一个数找出比这个数大的最小的数

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


  • 相关阅读:
    Python基础-time and datetime
    Python基础-包
    Python基础-常用模块
    第四十七天Python学习记录
    第四十四天Python学习记录
    如何教你在NIPS会议上批量下载历年的pdf文档(另附04~14年NIPS论文下载链接)
    如何用pdfbox-app-1.8.10.jar批处理将pdf文档转换成text文档
    如何在Win10下设置图片的浏览方式为windows照片查看器
    如何不通过系统升级来安装window10正式版?(特别针对Xp用户)
    Mysql统计信息处理及binlog解释
  • 原文地址:https://www.cnblogs.com/chonghui1001/p/2190394.html
Copyright © 2011-2022 走看看