求解黑洞數(shù)
來源:程序員人生 發(fā)布時(shí)間:2015-07-08 07:58:18 閱讀次數(shù):3601次
問題描寫:
黑洞數(shù)又稱圈套數(shù),是類具有奇特轉(zhuǎn)換特性的整數(shù)。任何1個(gè)數(shù)字不全相同的整數(shù),
經(jīng)有限“重排求差”操作,總會(huì)得到某1個(gè)或1些數(shù),這些數(shù)即為黑洞數(shù)。
“重排求差”操作即把組成該數(shù)的數(shù)字重排后得到的最大數(shù)減去重排后得到的最小數(shù)。
舉個(gè)例子,3位數(shù)的黑洞數(shù)為495.
簡易推導(dǎo)進(jìn)程:隨意找個(gè)數(shù),如297,3個(gè)位上的數(shù)從小到大和從大到小各排1次,
為972和279,相減得693。按上面做法再做1次,得到594,再做1次,得到495,
以后反復(fù)都得到495。
驗(yàn)證4位數(shù)的黑洞數(shù)為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趟排序中若未產(chǎn)生交換,表明已排序好,退出程序
break;
}
}
/* 升序:選擇排序 */
void inc_sort(int array[],int n)
{
int k;
for(int i=0;i<n⑴;++i)//n個(gè)數(shù),將前n⑴個(gè)數(shù)放置好就結(jié)束了
{
k = i;//假定要排序的1組數(shù)據(jù)中第1個(gè)數(shù)最小(k寄存待排序數(shù)據(jù)中最小值的下標(biāo))
for(int j=k+1;j<n;++j)
{
if(array[j] < array[k])//若存在比當(dāng)前值還小的數(shù),則交換下標(biāo)
{
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;
//注意:!??!求解進(jìn)程中會(huì)改變n的值,而下面要用到n,不想它改變
//所以用臨時(shí)變量保存他的值,改變臨時(shí)變量,而不改變它
int temp = n;
int array[LENTH];
int i = 0;
int count;
int max = 0;
int min = 0;
/* 將該數(shù)值的各個(gè)位寄存在數(shù)組中 */
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的值,所以改變臨時(shí)變量而不改變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<<"----------求解黑洞數(shù)-------------"<<endl;
cout<<" zyh_helen"<<endl;
cout<<"請輸入您要求的黑洞數(shù)的位數(shù):"<<endl;
cin>>n;
cout<<"請輸入"<<n<<"個(gè):任何1個(gè)數(shù)字不全相同的整數(shù)"<<endl;
cin>>num;
cout<<"黑洞數(shù)為:"<<black_hole_num(num)<<endl;
cout<<"continue:1 break:0"<<endl;
cin>>flag;
}
return 0;
}
當(dāng)輸入5的時(shí)候,會(huì)墮入[82962,75933,63954,61974]循環(huán)圈中

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