123 请用 A 中的元素组成一个大于 K 的最小正整数

来源:互联网 发布:软考程序员试题网盘 编辑:程序博客网 时间:2024/05/16 05:33

23、Google2009 华南地区笔试题
给定一个集合 A=[0,1,3,8](该集合中的元素都是在 0,9 之间的数字,但未必全部包含),
指定任意一个正整数 K,请用 A 中的元素组成一个大于 K 的最小正整数。 
比如,A=[1,0] K=21  那么输出结构应该为 100。

/*23、Google2009 华南地区笔试题给定一个集合 A=[0,1,3,8](该集合中的元素都是在 0,9 之间的数字,但未必全部包含),指定任意一个正整数 K,请用 A 中的元素组成一个大于 K 的最小正整数。 比如,A=[1,0] K=21  那么输出结构应该为 100。思路:  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]代替。*/ #include<stdio.h>#include<algorithm>#include<stdlib.h>int max=0;int cmp(const void *a,const void *b){return *(int*)a-*(int*)b;}//判断当前位是否在A中 int is_in(int *A,int number, int len) {int i=0; int j=len-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;}int get_number(int *A, int* B, int number, int len){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],len)) //最左边开始 从高位到低寻找到一位不在A中 后面用A[0]补 break;//在A中的不用变 for (j=i;j<bit;j++) {if (max!=B[p[j]]) //P[J]表示在A中的那一位 用B[P[J]]表示 大于这位数 {p[j]=B[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 main(){int A[]={3,1,0,8};int i, j;int *B =NULL;int number=123;int temp=0;int result=0;int len=sizeof(A)/sizeof(int);qsort(A,len,sizeof(A[0]),cmp); if (A[0]!=0) max=A[0]*11;//自己表示 eg:1->11 2->22 3->33 else max=A[1]*10;//0 1->10 ;0 2->20  B=(int *)malloc(sizeof(int)*10);if (!B) {printf("out of space\n");exit(0);}j=i=0;while(i<len&&j<10) {if (A[i]>j) {B[j]=A[i];j++;}else i++;}while (j<10) {B[j]=max;j++;}result=get_number(A,B,number,len);printf("the answer is %d\n", result);return 0;}

0 0
原创粉丝点击