码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-07-26 01:12:36      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   for   art   

输入一个高精度正整数n,去掉其中任意s个数字以后,
剩下的数字按原来的左右次序将组成一个新的正整数。
编程对给定的n和s,寻找一种方案使得所剩下的数字
组成的新数最小。
输出应该包括所去掉的数字的位置和组成的新的正整数。
其中,n不超过240位。

bubuko.com,布布扣
  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             else
103             {
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

 

贪心算法练习:寻找最小数,布布扣,bubuko.com

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

标签:style   blog   http   color   os   io   for   art   

原文地址:http://www.cnblogs.com/huashanqingzhu/p/3868859.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!