zoukankan      html  css  js  c++  java
  • ”高精度整数删去若干位以使剩下的值最小“问题

    问题描述:

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

     

  • 相关阅读:
    游标
    Linq to Sql学习
    在asp.net mvc中使用Uploadify上传文件
    Linq 笔记
    ASP.NET MVC笔记
    转:ASP.NET MVC:窗体身份验证及角色权限管理示例
    PowerDesigner
    asp.net缓存使用总结
    Bash Shell中命令行选项/参数处理
    Javascript parseFloat、parseDouble类型转换,数值加减,四舍五入
  • 原文地址:https://www.cnblogs.com/mmcmmc/p/3879097.html
Copyright © 2011-2022 走看看