python求黑洞數 求解黑洞數

2021-10-19 21:37:33 字數 2568 閱讀 2076

問題描寫:

黑洞數又稱圈套數,是類具有奇特轉換特性的整數。任何1個數字不全相同的整數,

經有限「重排求差」操作,總會得到某1個或1些數,這些數即為黑洞數。

「重排求差」操作即把組成該數的數字重排後得到的最大數減去重排後得到的最小數。

舉個例子,3位數的黑洞數為495.

簡易推導程序:隨意找個數,如297,3個位上的數從小到大和從大到小各排1次,

為972和279,相減得693。按上面做法再做1次,得到594,再做1次,得到495,

以後反覆都得到495。

驗證4位數的黑洞數為6174。解題思路:

/* 降序:氣泡排序 */

void dec_sort(int array,int n)

int flag = 0;

for(int i=0;i

for(int j=0;j

if(array[j] < array[j+1])

array[j] += array[j+1];//array[j] = array[j] + array[j+1]

array[j+1] = array[j] - array[j+1];

array[j] -= array[j+1];//array[j] = array[j] - array[j+1]

flag = 1;

if(flag == 0)//在1趟排序中若未產生交換,表明已排序好,退出程式

break;

/* 公升序:選擇排序 */

void inc_sort(int array,int n)

int k;

for(int i=0;i

k = i;//假定要排序的1組資料中第1個數最小(k寄存待排序資料中最小值的下標)

for(int j=k+1;j

if(array[j] < array[k])//若存在比當前值還小的數,則交換下標

k = j;

if(k != i)

array[i] += array[k];

array[k] = array[i] - array[k];

array[i] -= array[k];

int black_hole_num(int n)

cout<

//注意:!!!求解程序中會改變n的值,而下面要用到n,不想它改變

//所以用臨時變數儲存他的值,改變臨時變數,而不改變它

int temp = n;

int array[lenth];

int i = 0;

int count;

int max = 0;

int min = 0;

/* 將該數值的各個位寄存在陣列中 */

while(temp)

array[i] = temp%10;

i++;

temp /= 10;

count = i;

/* 元素公升序以後,求解最小值*/

inc_sort(array,count);

for(i=0;i

min = min*10 + array[i];

/* 元素降序以後,求解最大值*/

dec_sort(array,count);

for(i=0;i

max = max*10 + array[i];

/*if(max - min == n)//此處要用到n的值,所以改變臨時變數而不改變n

當輸入5的時候,會墮入[82962,75933,63954,61974]迴圈圈中

任何1個數字不全相同的整數,

經有限「重排求差」操作,總會得到某1個或1些數

,這些數即為黑洞數。

C程式設計94題 求黑洞數

1.任意輸入乙個數字 2.將數字存放到陣列中,對陣列從小到大排序 3.求重排後的最大值 4.求重排後的最小值 5.二者差值得到新的數字,如果新值與舊值不相等則重複2,3,4步。include include include include include define maxsize 100 氣泡排...

5位黑洞數

最近在做藍橋杯的練習題,做題目的過程並不順利,有時候會想很久,也去網上搜了些 但看得都是不明不白,最後自己想了好久,終於執行成功,有點小喜悅,也把自己的思路寫出來,雖然並不完美。題目描述 任意乙個5位數,比如 34256,把它的各位數字打亂,重新排列,可以得到乙個最大的數 65432,乙個最小的數2...

黑洞數(20 分)

黑洞數也稱為陷阱數,又稱 kaprekar問題 是一類具有奇特轉換特性的數。任何乙個各位數字不全相同的三位數,經有限次 重排求差 操作,總會得到495。最後所得的495即為三位黑洞數。所謂 重排求差 操作即組成該數的數字重排後的最大數減去重排後的最小數。6174為四位黑洞數。例如,對三位數207 以...