1.问题描述: 给定 n 位正整数 a,去掉其中任意 k≤n 个数字后,剩下的数字按原次序排列组成一个 新的正整数。对于给定的 n 位正整数 a 和正整数 k,设计一个算法找出剩下数字组成的新数 最小的删数方案。
2.算法设计: 对于给定的正整数 a,计算删去 k 个数字后得到的最小数。 数据输入:第 1 行输入正整数 a,第 2 行输入正整数 k。 数据输出:输出计算出的最小数。 例: 输入:178543 4 输出:13
#include<iostream>; #include<cstring>; using namespace std; int deleteNumber(char *a, int k) { int n = strlen(a); while (k > 0) { //每次删一个数,使得剩下的数按原序列组成最小。 for (int i = 0; i < n; i++) { if (i == n - 1) { n--; break; } //没找到那个单调递减的第一个数,就删掉非递减序列的最后一个数。 else if (a[i] > a[i + 1]) { for (int j = i; j < n - 1; j++) { a[j] = a[j + 1]; //删掉一个,后面的全部前移一位。 } n--; //长度减一 break; } } k--; } return n; } int main() { char* input = new char(); //char类型数组 cin >> input; int k; cin >> k; int m = deleteNumber(input, k); //调用删数函数 int b = 0; while ((b < (m - 1)) && (input[b] == '0')) b++; for (int i = b; i < m; i++) //输出最终数组 { cout << input[i]; } cout << "\n"; system("pause"); return 0; }