问题描写:
黑洞数又称圈套数,是类具有奇特转换特性的整数。任何1个数字不全相同的整数,
经有限“重排求差”操作,总会得到某1个或1些数,这些数即为黑洞数。
“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数。
举个例子,3位数的黑洞数为495.
简易推导进程:随意找个数,如297,3个位上的数从小到大和从大到小各排1次,
为972和279,相减得693。按上面做法再做1次,得到594,再做1次,得到495,
以后反复都得到495。
验证4位数的黑洞数为6174。解题思路:
#include
#include
#include
using namespace std;
#define LENTH 100
/* 降序:冒泡排序 */
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
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<
cout<
cout<
cin>>n;
cout<
cin>>num;
cout<
cout<
cin>>flag;
}
return 0;
}
当输入5的时候,会堕入[82962,75933,63954,61974]循环圈中
任何1个数字不全相同的整数,
经有限“重排求差”操作,总会得到某1个或1些数,这些数即为黑洞数。