首页 > 代码库 > 贪心算法练习:寻找最小数
贪心算法练习:寻找最小数
输入一个高精度正整数n,去掉其中任意s个数字以后,
剩下的数字按原来的左右次序将组成一个新的正整数。
编程对给定的n和s,寻找一种方案使得所剩下的数字
组成的新数最小。
输出应该包括所去掉的数字的位置和组成的新的正整数。
其中,n不超过240位。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int fun(char *a,int len,int s);//对数组a表示的高精度整数删除s位。a的长度是len。 5 void outPut(char *a,int len);//输出删除后的数组 6 int main() 7 { 8 char a[300]; 9 int len,s; 10 int res; 11 freopen("5.in","r",stdin); 12 scanf("%s",a); 13 scanf("%d",&s); 14 //printf("这个是辅助信息。数组原来的样子是:"); 15 //puts(a); 16 len=strlen(a); 17 res=fun(a,len,s); 18 if(res==0)/*fun函数返回值正常.*/ 19 { 20 outPut(a,len); 21 } 22 //printf("这个是辅助信息。数组最后的样子是:"); 23 //puts(a); 24 return 0; 25 } 26 int fun(char *a,int len,int s)//对数组a表示的高精度整数删除s位。a的长度是len。 27 { 28 int i,j=0,k=1; 29 for(i=0;i<s;i++) 30 { 31 while(!( a[j]>a[k] && a[k]!=‘*‘ ) && k<len)//直到a[j]>a[k]而且a[k]不是‘*‘这个条件不成立。注意: ‘*‘的ASCII码是小于数字0的. 32 { 33 //j++; 34 j=k; 35 k++; 36 } 37 if(k<len)// 也即 a[j]>a[k] && a[k]!=‘*‘ 这个条件成立了 38 { 39 a[j]=‘*‘; 40 } 41 else break; 42 while(j>=0)//j向左扫描寻找第一个非*数字 43 { 44 if(a[j]!=‘*‘) break; 45 j--; 46 } 47 if(j==-1)//假如j扫描到数组开头了都没遇到数字,j要指向k所指向的位置 48 { 49 j=k; 50 k++; 51 } 52 } 53 //下面是当上述操作删除的个数不足S个的时候所进行的操作:从后往前删除够s个数字 54 if(i<s) 55 { 56 j=len-1; 57 for(;i<s;i++) // for(;i<=s;i++) 58 { 59 while(a[j]==‘*‘&&j>=0)//从数组后面往前扫描寻找第一个数字字符 60 { 61 j--; 62 } 63 if(j>=0) 64 { 65 a[j]=‘*‘; 66 } 67 else 68 { 69 printf("输入错误!逆序数的对数达不到要删除的数量。同时剩余的位数也不够弥补未删除的位数。有可能是输入的s比较大,输入的高精度正整数n的位数比较少。、"); 70 return 1;//本函数非正常结束 71 } 72 } 73 } 74 return 0;//本函数正常结束 75 } 76 77 void outPut(char *a,int len)//输出删除后的数组 78 { 79 int i,flag,k; 80 k=0; 81 for(i=0;i<len;i++)//输出*号的位置 82 { 83 if(a[i]==‘*‘) 84 { 85 k++; 86 printf("%d ",i+1); 87 if(k%10==0) printf("\n"); 88 } 89 } 90 printf("\n"); 91 92 flag=0;//flag==0表示还没有输出过一个非0的数字字符 93 for(i=0;i<len;i++) 94 { 95 if(a[i]!=‘*‘)//说明a[i]是数字字符 96 { 97 if(a[i]!=‘0‘) 98 { 99 printf("%c",a[i]);100 flag=1;101 }102 else103 {104 if(flag==1) //a[i]是数字字符‘0‘,但是不是最高位的字符0. 105 printf("%c",a[i]);106 }107 }108 }109 if(flag==0) printf("0");110 printf("\n");111 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。