”高精度整数删去若干位以使剩下的值最小“问题

问题描述:

键盘输入一个高精度的正整数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;
}

”高精度整数删去若干位以使剩下的值最小“问题,布布扣,bubuko.com

时间: 2025-01-18 11:00:55

”高精度整数删去若干位以使剩下的值最小“问题的相关文章

算法导论----贪心算法,删除k个数,使剩下的数字最小

先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4,要求的最小数字b是n-k=6位的: 1.先找最高位的数,因为是6位数字,所以最高位不可能在后5位上取到(因为数字的相对顺序是不能改变的,假设如果取了后五位中倒数第5位的7,则所求的b就不可能是6位的了,最多也就是4位的79228)理解这点很重要!所以问题变成从第1位到第k+1(n-(n-k-1))取

高精度整数 - a+b(王道)

题目描述: 实现一个加法器,使其能够输出a+b的值. 输入: 输入包括两个数a和b,其中a和b的位数不超过1000位. 输出: 可能有多组测试数据,对于每组数据,输出a+b的值 样例输入: 2 6 1000000000000000000000 10000000000000000000000000000000000000000000 样例输出: 8 100000000000000000000000000000000000000000000 #include <iostream> #include

POJ - 2109 - Power of Cryptography = 高精度整数

http://poj.org/problem?id=2109 给一个大概100位的高精度整数p,找他的n次方根,貌似题目有问题,不一定会有开根开得尽的情况,这个时候要找的就是最大的根. 那这样有什么意思呢? 这种题按道理要用Java去写的,可以先从p和n的关系找到根的位数,然后在这个范围里面二分会更快. 具体来说,比如22位的p,7次方根,就是22/7的上整,取4位数. 还有就是因为题目的原因,double的精度对100位的高精度整数开根是足够的,也就是不会的话可以试试莽一发long doubl

【编程题目】一个数组是由一个递减数列左移若干位形成的,在这种数组中查找某一个数。☆

48.微软(运算):一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数. 我的思路: 非常麻烦:先是用二分法找最大的数的位置,再定位要找的数在哪个递减区间里,最后用普通的二分查找法找到.代码如下: /* 48.微软(运算): 一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5} 是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数. */ #include <stdi

交换整数的奇数位和偶数位

今天在一本书上看到一题:编写程序交换某个整数的奇数位和偶数位,使用指令越少越好(即位0与位1交换,位2与位3交换).看过题目解析之后才发觉,这题要交换的是整数二进制的奇数和偶数位. 按照一般的解题肯定会对每一位分别处理,即,将整数换成二进制,然后遍历一遍,交换奇数位和偶数位.这样效率不高,指令也不少.然后看大题目解析,感觉用位操作很棒,以下为解题思路: (1)先操作奇数位,把101010(即0xAA)作为掩码,提取奇数位,并右移1位到偶数位置 (2)操作偶数位,把010101(即0x5555)作

Java中的高精度整数和高精度小数

在实际编码中,会遇到很多高精度的事例,比如,在计算金钱的时候就需要保留高精度小数,这样计算才不会有太大误差: 在下面的代码中,我们验证了,当两个float型的数字相加,得到的结果和我们的预期结果是有误差的,为了减小和防止这种误差的出现,我们需要使用BigInteger类和BigDecimal类来计算. package com.ietree.base.number; import java.math.BigDecimal; import java.math.BigInteger; public c

9.5位操作(六)——交换某个整数的奇数位和偶数位,使用指令越少越好

/** * 功能:交换某个整数的奇数位和偶数位,使用指令越少越好(即,位0与位1交换,位2与位3交换,以此列推). */ /** * 思路:先操作奇数位,再操作偶数位.将数字n的奇数位右移1位,偶数位左移1位. * @param x * @return */ public static int swapOddEvenBits(int x){ //奇数位右移,0xaaaa aaaa=10101010 10101010 10101010 10101010 10101010 10101010 1010

8位有符号的取值范围是-128~+127

这是一个困惑了我几年的问题,它让我对现在的教科书和老师极其不满,从我N年前开始摸电脑时,就几乎在每一本C++教科书上都说,8位有符号的取值范围是-128~+127,为什么不是-127~+127呢,后来的java,int的聚值范围,再32位计算,-2^31 ~ +2^31-1,可是,却从来没有任何一本教科书或一个老师比我解释过这个问题 原因没有在工作上或者是什么地方直接遇到它,所以我也一直忽略它,但心里总是有一根刺.直到刚才!!!! 就是刚才,无聊之极,在看汇编的书时,又遇到它了,但一如以往,书上

【Leetcode】使数组唯一的最小增量(每日一题)

题目链接:使数组唯一的最小增量 题意:给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1. 返回使 A 中的每个值都是唯一的最少操作次数. 题解: 1.暴力sort.O(nlogn).排序以后,如果当前数字<=前一个数字,那么就把当前的数字变成前一个数字+1. 增量就是A[i-1]+1-A[i].遍历以后的结果就是要求的最小增量.跑了80ms 2.用一个数组表示hash.空间换时间.O(n). 我们对hash数组进行移动操作,每次对hash[i]>1的数字进行操作,只