求解黑洞數
來源:程序員人生 發布時間:2015-07-08 07:58:18 閱讀次數:3594次
問題描寫:
黑洞數又稱圈套數,是類具有奇特轉換特性的整數。任何1個數字不全相同的整數,
經有限“重排求差”操作,總會得到某1個或1些數,這些數即為黑洞數。
“重排求差”操作即把組成該數的數字重排后得到的最大數減去重排后得到的最小數。
舉個例子,3位數的黑洞數為495.
簡易推導進程:隨意找個數,如297,3個位上的數從小到大和從大到小各排1次,
為972和279,相減得693。按上面做法再做1次,得到594,再做1次,得到495,
以后反復都得到495。
驗證4位數的黑洞數為6174。
解題思路:

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
#define LENTH 100
/* 降序:冒泡排序 */
void dec_sort(int array[],int n)
{
int flag = 0;
for(int i=0;i<n⑴;++i)//n⑴趟排序
{
for(int j=0;j<n-i⑴;++j)//第i趟比較n-i次,由于i從0開始,所以還得⑴
{
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<n⑴;++i)//n個數,將前n⑴個數放置好就結束了
{
k = i;//假定要排序的1組數據中第1個數最小(k寄存待排序數據中最小值的下標)
for(int j=k+1;j<n;++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<<endl;
//注意:!!!求解進程中會改變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<count;++i)
{
min = min*10 + array[i];
}
/* 元素降序以后,求解最大值*/
dec_sort(array,count);
for(i=0;i<count;++i)
{
max = max*10 + array[i];
}
/* if(max - min == n)//此處要用到n的值,所以改變臨時變量而不改變n
return n;
else
return black_hole_num(max - min);*/
return (max - min == n) ? n:black_hole_num(max - min);
}
int main()
{
int flag = 1;
int n;
int num;
system("mode con cols=100 lines=100");
system("color 0A");
while(flag)
{
cout<<"----------求解黑洞數-------------"<<endl;
cout<<" zyh_helen"<<endl;
cout<<"請輸入您要求的黑洞數的位數:"<<endl;
cin>>n;
cout<<"請輸入"<<n<<"個:任何1個數字不全相同的整數"<<endl;
cin>>num;
cout<<"黑洞數為:"<<black_hole_num(num)<<endl;
cout<<"continue:1 break:0"<<endl;
cin>>flag;
}
return 0;
}
當輸入5的時候,會墮入[82962,75933,63954,61974]循環圈中

<span style="color:#ff0000;">任何1個數字不全相同的整數,
經有限“重排求差”操作,總會得到某1個或</span><span style="color:#3333ff;">1些數</span><span style="color:#ff0000;">,這些數即為黑洞數。</span>
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈