題目:消重輸出 題目介紹: 輸入一個正整數,給出消除重覆數字以後最大的整數,註意需要考慮長整數。 例: 輸入: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 省去。