求解黑洞数

问题描述:

黑洞数又称陷阱数,是类具有奇特转换特性的整数。任何一个数字不全相同的整数,
经有限“重排求差”操作,总会得到某一个或一些数,这些数即为黑洞数。
“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数。
举个例子,3位数的黑洞数为495.

简易推导过程:随便找个数,如297,3个位上的数从小到大和从大到小各排一次,
为972和279,相减得693。按上面做法再做一次,得到594,再做一次,得到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-1;++i)//n-1趟排序
	{
		for(int j=0;j<n-i-1;++j)//第i趟比较n-i次,因为i从0开始,所以还得-1
		{
			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)//在一趟排序中若未发生交换,表明已经排序好,退出程序
			break;
	}
}
/* 升序:选择排序 */
void inc_sort(int array[],int n)
{
	int k;
	for(int i=0;i<n-1;++i)//n个数,将前n-1个数放置好就结束了
	{
		k = i;//假设要排序的一组数据中第一个数最小(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<<"个:任何一个数字不全相同的整数"<<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;">任何一个数字不全相同的整数,
经有限“重排求差”操作,总会得到某一个或</span><span style="color:#3333ff;">一些数</span><span style="color:#ff0000;">,这些数即为黑洞数。</span>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值