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


    问题描述:

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

     

  • 相关阅读:
    求1000以内的勾股数的算法流程图
    23天的单车旅行,从广州到四川,重庆,大足石刻,母校,家,发完了
    好玩的Flash:跟鼠标拼命
    23天的单车旅行,从广州到四川,息烽集中营,韩国人,乌江,遵义
    如何彻底删除SQL Server2005
    EOF,EOC与感叹号的区别
    如何彻底卸载vs2008及其组件?
    PHP中extract()函数的妙用
    php 函数合并 array_merge 与 + 的区别
    unserialize error at offset
  • 原文地址:https://www.cnblogs.com/mmcmmc/p/3879097.html
Copyright © 2020-2023  润新知