博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
”高精度整数删去若干位以使剩下的值最小“问题
阅读量:5157 次
发布时间:2019-06-13

本文共 1676 字,大约阅读时间需要 5 分钟。

问题描述:

键盘输入一个高精度的正整数N(不超过240位) ,去掉其中任意M个数字后剩下的数字按原左右次序将组成一个新的正整数。

编程对给定的N和M,寻找一种方案使得剩下的数字组成的新数最小。输出组成的新的正整数。

输入数据均不需判错。 如果去掉了某几个位后得到的新整数开头为0,保留0。

 

输入:

本题有多组测试数据,每组测试数据占一行。 

一个高精度正整数N(N不超过240位)一个正整数M。(M为不大于N的长度的正整数) 
N,M由一个空格分开。

456547 1

456547 2

456547 3

7773359 2

103 1

输出:

新的正整数,每组数据的输出占一行。不要多余的空白.

45547

4547

447

73359

03

 

问题分析:

在位数固定前提下,让高位的数字尽量小,其值就较小。依据贪心策略可以解决这个问题。

如何根据贪心来删除数字呢?总目标是删除高位较大的数字,具体地:相邻两位比较,若高位比地位大则删除高位。

但是看下面的特殊情况:

N="1234567"  M=3

经过对N相邻位进行比较,一个数字也没删除,这就要将后3位删除。如果在相邻比较的过程中删除的位数小于M,也要进行相似的操作。

 

算法设计:

删除字符的实现方法很多,如:1.物理的进行字符删除。2.记录状态。3.。。。

代码如下:

 

# include
//# include
using namespace std;# include
int main(){ string n; int m; int i, j, k, l; while (cin >> n >> m) { l = 0; for (string::iterator it = n.begin(); it != n.end(); it++) { l++; } if (l == m) { cout << 0 << endl; } else { k = 0; i = 0; while (k < m&&i < l - 1) { if (n[i]>n[i + 1]) { for (j = i + 1; j < l; j++) { n[j - 1] = n[j]; } i = i == 0 ? 0 : i--;//not forget i--,and if i<0 then i=0 k++; } else { i++; } } for (i = 0; i < l - m; i++)//imatate cuting last l-m chars { cout << n[i]; } cout << endl; } } return 0;}
View Code

 

 

转载于:https://www.cnblogs.com/mmcmmc/p/3879097.html

你可能感兴趣的文章
JNI学习积累之一 ---- 常用函数大全
查看>>
Android TableLayout中的使用说明
查看>>
LeetCode - Permutations II
查看>>
JS 混合构造函数 和 动态原型
查看>>
Js 之 递归,闭包
查看>>
冒泡排序,递归二分查找法,二分法
查看>>
json转换成dart类 JSON to Dart
查看>>
【转】关于维生素的那些事
查看>>
Win7下的C盘重新划分为两个盘
查看>>
IIS7 如何设置读取、脚本和可执行文件的执行权限
查看>>
今日早上出来还是阴天
查看>>
听说本周五要进行一个小测试,公司对员工的考核
查看>>
查询删除的表的信息
查看>>
oracle 配置 ACL 使用数据库发送WebServic请求时需要
查看>>
每日冲刺报告——Day2(Java-Team)
查看>>
ffplay.exe操作方式
查看>>
TestNG
查看>>
[算法]复杂链表的复制
查看>>
【LeetCode】437. Path Sum III
查看>>
求最近点对算法分析 closest pair algorithm
查看>>