华为笔试——C++消重输出
程序员文章站
2022-07-09 22:02:39
题目:消重输出 题目介绍: 输入一个正整数,给出消除重复数字以后最大的整数,注意需要考虑长整数。 例: 输入:988274320 输出:9874320 题目分析:这个结果的实现需要两个步骤:消重和排序。第一步,消重。先用string 和char 将数字分别储存进char 数组,然后从左边第一个字符开 ......
题目:消重输出
题目介绍:
输入一个正整数,给出消除重复数字以后最大的整数,注意需要考虑长整数。
例:
输入:988274320
输出:9874320
题目分析:这个结果的实现需要两个步骤:消重和排序。第一步,消重。先用string 和char 将数字分别储存进char 数组,然后从左边第一个字符开始逐个向右边比较,如果有相同的字符就将左边的置换成 ‘a’ ,这样多次次循环过后988274320就变成了9a8a74320,因为是向右比较且只变换左边字符,因此a 不会重复。第二步,排序。就是循环比较,大的字符向右靠即可。
代码:
1 #include <iostream> 2 #include <string> 3 #include <math.h> 4 #include <conio.h> 5 using namespace std; 6 int main() 7 { 8 int size; 9 cout << "请输入位数:" << endl; 10 cin >> size; 11 int i = 0,j = 0,n = 0; 12 int count = 0; 13 long result = 0; 14 char c; 15 char *p = new char[size]; 16 cout << "请输入" << size << "位正整数" << endl; 17 while ((c = _getch()) != '\r') 18 { 19 if (c >= '0'&&c <= '9') 20 { 21 p[count] = c; 22 cout << c; 23 count++;//字符形式存储在数组里 24 } 25 } 26 for (i = 0; i < size; i++) 27 { 28 for (j = 0; j < size; j++) 29 { 30 if (p[i] == p[j] && i < j) 31 { 32 p[i] = 'a';//重复的数字,左边的变成a 33 n++;//每有一个重复的,n++ 34 } 35 } 36 } 37 cout << endl; 38 for (i = 0; i < size;i++) 39 { 40 cout << p[i]; 41 } 42 cout << endl; 43 for (i = 0; i < size; i++) 44 { 45 for (j = 0; j < size; j++) 46 { 47 if (p[i] < p[j] && i < j) 48 { 49 count = p[i]; 50 p[i] = p[j]; 51 p[j] = count;//数字大的排前面 52 } 53 } 54 } 55 cout << n << endl; 56 for (i = 0; i < size; i++) 57 { 58 cout << p[i]; 59 } 60 cout << endl; 61 for (i = 0; i < size; i++) 62 { 63 if (i >= n)//输出除了a之外的数字 64 { 65 cout << p[i]; 66 result += (int(p[i])-48) * int(pow(10, size - i - 1));//转换成正整数 67 } 68 } 69 cout << endl << result << endl; 70 return 0; 71 }
结果:
其中输入位数这一步可用string 与 char 的strcpy 省去。
下一篇: 孝庄为康熙选皇后时,为何会选择赫舍里氏?