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

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

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

 

相关文章
|
3月前
|
数据采集 监控 前端开发
如何开发生产小工单中的数字化看板(附架构图+流程图+代码参考)
本文介绍了如何通过数字化看板优化生产小工单管理。内容涵盖生产小工单的概念、数字化看板的功能模块(如生产监控、执行统计、数据统计、员工工资统计)、业务流程设计、技术架构与开发技巧,并提供代码示例,助力企业实现高效、可视化的生产管理。
|
8月前
|
机器学习/深度学习 计算机视觉 异构计算
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2023 FasterNet 高效快速的部分卷积块
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2023 FasterNet 高效快速的部分卷积块
280 0
RT-DETR改进策略【模型轻量化】| 替换骨干网络 CVPR-2023 FasterNet 高效快速的部分卷积块
|
8月前
|
数据可视化 JavaScript 小程序
1.3K star!VisActor团队开源神器,3秒生成商业级图表,程序员直呼真香!
VChart是由VisActor团队推出的高性能可视化解决方案,GitHub上已获2.3k+星标。它支持Web、小程序和Node.js多端适配,具备百万级数据流畅渲染、20+图表类型深度定制等优势。核心功能包括声明式语法、智能图表推荐及企业级扩展能力。适用于金融大屏、商业智能、工业物联网等场景,提供极简代码实现商业级数据可视化。
183 0
|
11月前
|
自然语言处理 算法
RAG真能提升LLM推理能力?人大最新研究:数据有噪声,RAG性能不升反降
随着大型语言模型(LLM)在自然语言处理领域的广泛应用,检索增强生成(RAG)技术因能引入新知识和减少幻觉而受到关注。然而,RAG对LLM推理能力的实际提升效果仍存争议。中国人民大学的一项研究表明,RAG虽能辅助LLM推理,但在处理含噪信息和深度推理时面临挑战。为此,研究团队提出了DPrompt tuning方法,旨在解决噪声问题并提升RAG性能。
253 12
|
11月前
|
存储 算法 安全
消息认证码(MAC)在物联网发布者中如何应用
消息认证码(MAC)在物联网发布者中的应用主要是为了确保数据的完整性和来源的真实性。通过使用密钥生成的MAC值,可以验证发送者身份和数据未被篡改,从而提高物联网系统的安全性和可靠性。
|
数据库 Go 数据安全/隐私保护
|
应用服务中间件 网络安全 nginx
|
存储 机器学习/深度学习 JSON
Python 对象的序列和反序列化
在本文中,我们了解了 Python 中的 pickling(对象序列化) 和 unpickling (反序列化)操作,这些操作对于存储对象以供以后使用很有用。介绍了内置的 pickle 模块提供了诸如 load()、loads()、dump()、dumps() 之类的方法,用于将 Python 对象与字节流之间的相互转换。
540 0
Python 对象的序列和反序列化
|
消息中间件 JavaScript 小程序
SpringBoot+Netty+WebSocket 实现消息推送
SpringBoot+Netty+WebSocket 实现消息推送
SpringBoot+Netty+WebSocket 实现消息推送