您的位置:首页 > 编程语言

输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对所给的n和s,寻找一种方案使得剩下的数字组成的新数最小。

2016-04-19 16:32 1886 查看
思路:相邻两位若高位比低位大则删除高位。当第i位与第i+1位比较,若删除第i位后,必须向前考虑第i-1位与第i+1位进行比较,才能保证结果的正确性。

C++源代码

#include <iostream>
#include <string>
using namespace std;

//从字符串v中从下标j开始删除s个字符,删除的字符保存在s_del中
void min_num(string &v, int &s,int j,string &s_del)
{
if ( 0 != s)
{
//如果j小于0则从第0个字符开始
if (j<0)
{
min_num(v,s,0,s_del);
}
for (size_t k = j;k<v.size()-1;++k)
{
if (v[k]>v[k+1])
{
//保存删除的字符
s_del += v[k];
//将第k个字符删除
v.erase(k,1);
//递归,从字符串v中从下标k-1开始删除s-1个字符,删除的字符保存在s_del中
min_num(v,--s,k-1,s_del);
}
}
}
}

//从字符串v中删除s个字符,删除的字符保存在s_del中
void fun(string &v, int s,string &s_del)
{
if (v.size() <= s)
{
exit(1);
}
min_num(v,s,0,s_del);
//如果删除的字符不足s个
while (s>0)
{
v.erase(v.size()-1,1);
--s;
}
//将字符串前面的“0”去掉
v.erase(0,v.find_first_not_of('0'));
if (v.empty())
{
v = "0";
}
}

int main()
{
string v1 = "231183";
string v2 = "12435863";
string v3 = "1234567";
string v4 = "120083";

string s_del="";
cout <<"原数字:"<<v1<<'\t';
fun(v1,3,s_del);
cout<<"删除后的结果:"<<v1<<'\t'<<"删除的字符串:"<<s_del<<endl;

s_del="";
cout <<"原数字:"<<v2<<'\t';
fun(v2,3,s_del);
cout<<"删除后的结果:"<<v2<<'\t'<<"删除的字符串:"<<s_del<<endl;

s_del="";
cout <<"原数字:"<<v3<<'\t';
fun(v3,3,s_del);
cout<<"删除后的结果:"<<v3<<'\t'<<"删除的字符串:"<<s_del<<endl;

s_del="";
cout <<"原数字:"<<v4<<'\t';
fun(v4,3,s_del);
cout<<"删除后的结果:"<<v4<<'\t'<<"删除的字符串:"<<s_del<<endl;

return 0;
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: