For any 4-digit integer except the ones with all the digits being the same, if we sort the digits in non-increasing order first, and then in non-decreasing order, a new number can be obtained by taking the second number from the first one. Repeat in this manner we will soon end up at the number 6174 -- the "black hole" of 4-digit numbers. This number is named Kaprekar Constant.
For example, start from 6767, we'll get:
7766 - 6677 = 1089\ 9810 - 0189 = 9621\ 9621 - 1269 = 8352\ 8532 - 2358 = 6174\ 7641 - 1467 = 6174\ ... ...
Given any 4-digit number, you are supposed to illustrate the way it gets into the black hole.
Input Specification:
Each input file contains one test case which gives a positive integer N in the range (0, 10000).
Output Specification:
If all the 4 digits of N are the same, print in one line the equation "N
- N = 0000". Else print each step of calculation in a line until 6174 comes out as the difference. All the numbers must be printed as 4-digit numbers.
Sample Input 1:
6767
Sample Output 1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
Sample Input 2:
2222
Sample Output 2:
2222 - 2222 = 0000
解答:该问题的求解思路是用string处理数字,最大值和最小值可以用sort函数得到,string和int的转换用 stringstream对象实现。特殊情况是1)如果刚开始是4位数相同的数字,那么直接输出;2)在运算过程中,可能数字的位数发生变化,比如输入1,那么最大值1000,最小值1,difference为999,转换为string后需要补0,即 “9990”,然后再计算得到最大值和最小值。
AC代码如下:
#include<cstdio>
#include<vector>
#include<string>
#include<sstream>
#include<algorithm>
using namespace std;
bool isLarger(char c1, char c2)
{
return c1 > c2;
}
int main()
{
int n, min, max;
string str, smin, smax;
stringstream ss;
scanf("%d", &n);
ss << n;
ss >> str;
ss.clear();
//对四位数用字符'0'补齐
while(4 - str.size())
{
str.push_back('0');
}
sort(str.begin(), str.end());
smin = str;
sort(str.begin(), str.end(), isLarger);
smax = str;
ss << smax; ss >> max; ss.clear();
ss << smin; ss >> min; ss.clear();
//printf("max:%d, min%d\n", max, min);
if(smin == smax)
{
printf("%04d - %04d = 0000\n", max, min);
}
else
{
while(max - min != 6174)
{
if(min != 0)
printf("%04d - %04d = %04d\n", max, min, max - min);
else
break;
ss << max - min; ss >> str; ss.clear();
//对四位数用字符'0'补齐
while(4 - str.size())
{
str.push_back('0');
}
//排序得到最小数和最大数
sort(str.begin(), str.end());
smin = str;
sort(str.begin(), str.end(), isLarger);
smax = str;
ss << smax; ss >> max; ss.clear();
ss << smin; ss >> min; ss.clear();
//printf("max:%d, min%d\n", max, min);
}
if(min != 0)
printf("%04d - %04d = %04d\n", max, min, max - min);
}
return 0;
}