输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对所给的n和s,寻找一种方案使得剩下的数字组成的新数最小。
2016-04-19 16:32
1886 查看
思路:相邻两位若高位比低位大则删除高位。当第i位与第i+1位比较,若删除第i位后,必须向前考虑第i-1位与第i+1位进行比较,才能保证结果的正确性。
C++源代码:
运行结果:
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; }
运行结果:
相关文章推荐
- ReactiveCocoa代码实践之-更多思考
- Java对象数组
- C++连接SQL数据库第一步 系统配置
- PHP mysql
- 利用ResultFilter实现asp.net mvc3 页面静态化
- C++ int、string等常见类型转换
- spring bean的scope属性
- HM编码器代码阅读(18)——变换以及量化(一)
- Python 解析配置模块之ConfigParser详解
- 【转】如何用 C/C++ 求 1 到 1000 内的所有完全数
- RxJava 操作符之创建类操作符
- Esc界面代码实现
- java中String为什么是不可变的
- Myeclipse10 和activiti designer整合
- 单链表----定义、增加节点、删除节点、遍历输出(java)
- java设计模式之策略模式
- TP扩展Xxtea.class.php加密解密函数用法
- Java中ArrayList类详解
- C# 生成随机数重复问题
- 【C#图解】PictureBox.SizeMode 属性