1019. 数字黑洞 (20)
时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。
例如,我们从6767开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
现给定任意4位正整数,请编写程序演示到达黑洞的过程。
输入格式:
输入给出一个(0, 10000)区间内的正整数N。
输出格式:
如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例。注意每个数字按4位数格式输出。
输入样例1:6767输出样例1:
7766 - 6677 = 1089 9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174输入样例2:
2222输出样例2:
2222 - 2222 = 0000
巧妙地将数字利用字符串处理并排序从而得到最大和最小值
补零:cout.fill('0');
头文件:#include<iomanip>
设置宽度:cout<<setw(4);
注意点:有三个测试点是数值小于1000的,即567、56、7等
1 // 1019.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 #include<string> 7 #include<algorithm> 8 #include<iomanip> 9 10 using namespace std; 11 12 int get_num(string num);//获取差值 13 string int_to_str(int num);//将int转换为string 14 15 int main() 16 { 17 string num; 18 int x; 19 20 cin >> num; 21 22 if (num[0] == num[1] && num[1]==num[2]&& num[2] == num[3]) 23 cout << num << " - " << num << " = " << "0000" <<endl; 24 else 25 { 26 while ((x = get_num(num)) != 6174) 27 num=int_to_str(x); 28 } 29 30 return 0; 31 } 32 33 //获取差值 34 int get_num(string num) 35 { 36 int max, min,size=num.size(); 37 38 //字符串不满足四位,后面补零即可,后面排序会打乱 39 if (size < 4) 40 { 41 for (int i = 0; i < 4 - size; ++i) 42 num.push_back('0'); 43 } 44 45 sort(&num[0], &(num[4]));//从小到大排序 46 47 //得到最小最大值 48 min = (num[0] - 48) * 1000 + (num[1] - 48) * 100 + (num[2] - 48) * 10 + num[3] - 48; 49 max = (num[0] - 48) + (num[1] - 48) * 10 + (num[2] - 48) * 100 + (num[3] - 48)*1000; 50 51 cout.fill('0'); 52 53 cout << max << " - " << setw(4) << min << " = " << setw(4) << max - min << endl; 54 55 return max - min; 56 } 57 58 //将int转换为string 59 string int_to_str(int num) 60 { 61 string str; 62 63 for (int i = 1; i <= 4; ++i) 64 { 65 str.push_back(char(num % 10 + 48)); 66 67 num /= 10; 68 } 69 70 return str; 71 }