1069. The Black Hole of Numbers (20)
时间限制
100 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
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
#include<algorithm>//用sort
#include<math.h>//用于指数
using namespace std;
bool compare(int a, int b)
{
return a > b;
}//用于降序排序
int* kaprekar(int *a)
{
int b[4];
for (int i = 0; i < 4; i++)
{
b[i] = a[i];
}
sort(a, a + 4);//升序
sort(b, b + 4, compare);//降序
int sum1 = 0, sum2 = 0;
for (int i = 3; i >=0; i--)
{
sum1 += a[i] * pow(10, 3 - i);
sum2 += b[i] * pow(10, 3 - i);
}
cout << b[0] << b[1] << b[2] << b[3];
cout << " " << "-" << " ";
cout << a[0] << a[1] << a[2] << a[3];
int temp = sum2 - sum1;
for (int i = 3; i >= 0; i--)
{
a[i] = temp % 10;
temp = temp / 10;
}
cout << " " << "=" << " ";
cout << a[0] << a[1] << a[2] << a[3]<<endl;
return a;
}
int main()
{
int a1;
cin >> a1;
int *a = new int[4];
for (int i = 3; i >= 0; i--)
{
a[i] = a1 % 10;
a1 = a1 / 10;
}
int temp = 0;
while (true)
{
if (temp != 6174)
{
a = kaprekar(a);
temp = 0;
for (int i = 3; i >= 0; i--)
{
temp += a[i] * pow(10, 3 - i);
}
if (temp == 0 || temp == 6174)
break;
}
}
return 0;
}