給定任一個各位元字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到一個新的數字。一直重複這樣做,我們很快會停在有“數字黑洞”之稱的6174,這個神奇的數字也叫Kaprekar常數。例如,我們從6767開始,將得到7766 - 6677 = 10899810 - 0189 = 96219621 - 1269 = 83528532 - 2358 = 61747641 - 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
#include <iostream>#include <algorithm>#include <string.h>#include <math.h>using namespace std;int sub;char a[4];char b[4];int main(){ int m=0,n=0; cin>>a; int x=strlen(a); if(x<4) { for(int i=x;i<4;i++) { a[i]='0'; } } int t=0; while(t!=6174) { sort(a,a+4); for(int i=0;i<4;i++) { b[i]=a[3-i]; } for(int i=0;i<4;i++) { m=m*10; n=n*10; m+=(a[i]-'0'); n+=(b[i]-'0'); } sub=n-m; t=sub; if(sub==0) { break; } printf("%04d - %04d = %04d\n",n,m,sub); m=0;n=0; for(int i=3;i>=0;i--) { a[i]=sub%10+'0'; sub/=10; } } if(t==0) { printf("%04d - %04d = 0000",n,m); //cout<<n<<" - "<<m<<" = 0000"; } return 0;}