首页 > 代码库 > 贪心算法练习:寻找最小数

贪心算法练习:寻找最小数

输入一个高精度正整数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 }
View Code