”高精度整数删去若干位以使剩下的值最小“问题
2014-07-30 20:51
246 查看
问题描述:
键盘输入一个高精度的正整数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.。。。
代码如下:
View Code
键盘输入一个高精度的正整数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<iostream> //# include<stdio.h> using namespace std; # include<string> 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
相关文章推荐
- 高精度整数去位去最小问题
- 1403高精度整数去位去最小问题
- 输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对所给的n和s,寻找一种方案使得剩下的数字组成的新数最小。
- fjnu 1403 高精度整数去位去最小问题
- 高精度整数去位去最小问题
- 高精度整数去位去最小问题
- 高精度整数去位取最小问题
- 高精度整数去位取最小问题
- 高精度整数去位去最小问题
- 高精度整数去位去最小问题
- 回文数、整数输出,数字序列最小分割问题
- * 问题描述:输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数; ①输入10个数;②进行处理;③输出10个数。
- 任意2n个整数,从其中选出n个整数,使得选出的n个整数和同剩下的n个整数之和的差最小
- 高精度正整数乘法问题
- 【转】关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767=
- Card NUmbers 给N个值为1-24的数 2+2=4 则会删去两个2和一个四 求剩下数的最小和
- hdu 3183 A Magic Lamp(给一个n位的数,从中删去m个数字,使得剩下的数字组成的数最小(顺序不能变),然后输出)
- 从N位数字串中删去M个数使剩下的数字串所表示的数值最小
- 问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。 输入格式 输入一个正整数N。 输出格式 输出一个整数,表示你找到的最小公倍数。 样例输入 9 样例输出 5
- 【转】关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767