码迷,mamicode.com
首页 > 其他好文 > 详细

求解黑洞数

时间:2015-04-30 21:54:54      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:黑洞数   排序   函数块   数值的各个位存放在数组中   

问题描述:

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


求解黑洞数

标签:黑洞数   排序   函数块   数值的各个位存放在数组中   

原文地址:http://blog.csdn.net/zongyinhu/article/details/45398819

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!