给定任一个各位数字不完全相同的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
代码语言:javascript复制#include <iostream>
using namespace std;
bool IsSame( int a)
{
int num[4];
for ( int i = 0 ; i < 4 ; i ){
num[i] = a % 10;
a /= 10;
}
int tmp = num[0];
int count = 1;
for ( int i = 1 ; i < 4 ; i ){
if (num[i] == tmp){
count ;
}
}
if ( count == 4){
return true;
}else{
return false;
}
}
int NotMaxSort(int Num)
{
int num[4];
for ( int i = 0 ; i < 4 ; i ){
num[i] = Num % 10;
Num /= 10;
}
for ( int i = 0 ; i < 3 ; i ){
for ( int j = i 1 ; j < 4 ; j ){
if ( num[j] >= num[i] ){
num[i] = num[i] num[j];
num[j] = num[i] - num[j];
num[i] = num[i] - num[j];
}
}
}
int sum = 0;
for ( int i = 0 ; i < 4 ; i ){
sum = sum * 10 num[i];
}
return sum;
}
int NotMinSort(int Num)
{
int num[4];
for ( int i = 0 ; i < 4 ; i ){
num[i] = Num % 10;
Num /= 10;
}
for ( int i = 0 ; i < 3 ; i ){
for ( int j = i 1 ; j < 4 ; j ){
if ( num[j] <= num[i] ){
num[i] = num[i] num[j];
num[j] = num[i] - num[j];
num[i] = num[i] - num[j];
}
}
}
int sum = 0;
for ( int i = 0 ; i < 4 ; i ){
sum = sum * 10 num[i];
}
return sum;
}
int main()
{
int Num;
cin>>Num;
if ( IsSame(Num) == false){
int a ,b ,c;
do{
a = NotMaxSort(Num);
b = NotMinSort(Num);
c = a - b;
cout<<a<<" - ";
if ( b == 0 ){
cout<<"0000 = "<<c<<endl;
}else{
if ( b / 10 == 0){
cout<<"000"<<b<<" = "<<c<<endl;
}else{
if ( b / 100 == 0){
cout<<"00"<<b<<" = "<<c<<endl;
}else{
if ( b / 1000 == 0){
cout<<"0"<<b<<" = "<<c<<endl;
}else{
cout<<b<<" = "<<c<<endl;
}
}
}
}
Num = c;
}while( c != 6174);
}
else{
cout<<Num<<" - "<<Num<<" = 0000n";
}
return 0;
}
(PS:图中显示的错误实在找不出来了。)