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 来接受参数比较方便
参考代码:
#include <iostream>
#include <algorithm>
using namespace std;
int compare(char a,char b){
return a>b;
}
string getStandard(string s){
if(s.size()<4){
int x = 4-s.size();
for(int i=0;i<x;i++){
s = "0"+s;
}
}
char *temp = new char[s.size()];
for(int i=0;i<s.size();i++){
temp[i] = s[i];
}
sort(temp,temp+s.size(),compare);
string result = "";
for(int i=0;i<s.size();i++){
result += temp[i];
}
return result;
}
string reverseIt(string s){
string temp = "";
for(int i=0;i<s.size();i++){
temp += s[s.size()-1-i];
}
return temp;
}
string caculate(string s1,string s2){
int mark = 0;
string result = "";
for(int i=s1.size()-1;i>=0;i--){
if(mark==0){
if(s2[i]>=s1[i]){
char ch = s2[i]-s1[i]+'0';
result = ch+result;
mark = 0;
}else{
char ch = s2[i]-s1[i]+10+'0';
result = ch+result;
mark = 1;
}
}else{
if(s2[i]>s1[i]){
char ch = s2[i]-s1[i]-1+'0';
result = ch +result;
mark = 0;
}else{
char ch = s2[i]-s1[i]+10+'0'-1;
result = ch+result;
mark = 1;
}
}
}
return result;
}
string N;
int main()
{
cin>>N;
string standard = getStandard(N);
if(standard==reverseIt(standard)){
cout<<standard<<" - "<<standard<<" = "<<"0000";
return 0;
}
while(standard!="6174"){
string reverseS = reverseIt(standard);
string result = caculate(reverseS,standard);
cout<<standard<<" - "<<reverseS<<" = "<<result<<endl;
if(result=="6174"){
break;
}
standard = getStandard(result);
}
return 0;
}