程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> NOYJ——尋找最大數,NOYJ——

NOYJ——尋找最大數,NOYJ——

編輯:C++入門知識

NOYJ——尋找最大數,NOYJ——


1)題目:尋找最大數

    請在整數 n 中刪除m個數字, 使得余下的數字按原次序組成的新數最大,比如當n=92081346718538,m=10時,則新的最大數是9888輸入第一行輸入一個正整數T,表示有T組測試數據

  輸入

   每組測試數據占一行,每行有兩個數n,m(n可能是一個很大的整數,但其位數不超過100位,並且保證數據首位非0,m小於整數n的位數)

  輸出

   每組測試數據的輸出占一行,輸出剩余的數字按原次序組成的最大新數

  樣例輸入

    2
    92081346718538 10
    1008908 5

  樣例輸出

    9888 98

2)算法分析:

   題目中明確的指出了要刪除一部分數,使得剩下的數最大,那麼我們同樣可以將思路反轉,我們來選取最大的數,使之構成s最大的數。就像樣例中m=10;我們就可以選取strlen(s)-m個數字來構成我們所需要的數。首先我們將數字以字符串的形式來存儲。其次,我們需要選擇最高位的數字,但是題目中的要求是在原數上刪除,所以我們不可以打亂原數字各個位的順序,所以第一個數字我們只能從s[0]到s[m]中查找最大數,然後從最大數字之後的一位到s[m+1]中查找第二位,直至找到最後一位。在這個過程中我們必須要保證還有足夠的數字來供我們選擇,因為不管什麼,數位多的肯定要比數位少的大。

 

3)源代碼:

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

int main()
{
int ncase;
char s[110], ans[110];
int m, len, sign, max, num;
scanf("%d", &ncase);
while(ncase--)
{
num = sign = 0;
scanf("%s%d", s, &m);
len = strlen(s);
for(int i = 0; i < len - m; ++i) //找m次最大值
{
max = -1;
for(int j = sign; j <= m + i; ++j) //j的范圍不能錯~保證位數
{
if(max < s[j] - '0')
{
max = s[j] - '0';
sign = j;
}
}
ans[num++] = s[sign++];
}
for(int i = 0; i < len - m; ++i)
cout<<ans[i] - '0';
cout<<endl;
}
return 0;
}

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved