黑洞數也稱為陷阱數,又稱「kaprekar問題」,是一類具有奇特轉換特性的數。任何乙個各位數字不全相同的三位數,經有限次「重排求差」操作,總會得到495。最後所得的495即為三位黑洞數。所謂「重排求差」操作即組成該數的數字重排後的最大數減去重排後的最小數。(6174為四位黑洞數。)
例如,對三位數207:
第1次重排求差得:720 - 27 = 693;
第2次重排求差得:963 - 369 = 594;
第3次重排求差得:954 - 459 = 495;
以後會停留在495這一黑洞數。如果三位數的3個數字全相同,一次轉換後即為0。
任意輸入乙個三位數,程式設計給出重排求差的過程。
輸入格式:
輸入在一行中給出乙個三位數。
輸出格式:
按照以下格式輸出重排求差的過程:
序號: 數字重排後的最大數 - 重排後的最小數 = 差值
序號從1開始,直到495出現在等號右邊為止。
輸入樣例:
123
輸出樣例:
1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495
本題思路的一般解法是輸入整數,數字分離,陣列存位,sort公升序降序排序,比較麻煩,有個簡便方法是輸入字串,利用sscanf和sprintf來實現二者間的轉化。**如下:
#include
#include
using
namespace
std;
char ss[10]=;
int main()
}
由此延伸,求四位數的黑洞數,所以用正常的輸入整數,數字分離,或用sscanf和sprintf
數字分離:
#include
#include
using namespace std;
int main()
; scanf("%d",&n);
int c=n,a1=0,a2=0;
while(c!=0)//若整數每位數字都相等則輸出一次後退出
sort(a,a+4,greater());//降序
a1=1000
*a[0]+100
*a[1]+10
*a[2]+a[3];
sort(a,a+4);//公升序
a2=1000
*a[0]+100
*a[1]+10
*a[2]+a[3];
c=a1-a2;
printf("%04d - %04d = %04d\n",a1,a2,c);
if(c==6174)//若結果為6174則退出迴圈
break;
}}
sscanf和sprintf應用
#include
#include
using
namespace
std;
char ss[6]=;
bool cmd(char q,char h)
int main()
}
1019 數字黑洞 20
pat1019 include include include include using namespace std void vector2i vector v,int sum vector轉整型 v.resize 4,0 若不滿4位,則繼續補0 reverse v.begin v.end 反轉...
1019 數字黑洞 20
時間限制 100 ms 記憶體限制 32000 kb 長度限制 8000 b 判題程式 standard 作者 chen,yue 給定任乙個各位數字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停...
1019 數字黑洞 20
給定任乙個各位數字不完全相同的4位正整數,如果我們先把4個數字按非遞增排序,再按非遞減排序,然後用第1個數字減第2個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的6174,這個神奇的數字也叫kaprekar常數。例如,我們從6767開始,將得到 7766 6677 10...