一、数字黑洞是什么?
数字黑洞是这样一种现象:任意选一个四位数(数字不能全相同),把所有数字从大到小排列,再把所有数字从小到大排列,用前者减去后者得到一个新的数。重复对新得到的数进行上述操作,7 步以内必然会得到 6174。
编程实现以上过程,若输入的四位数数字全相同,重新输入,将每一步减法的结果显示在屏幕上。
二、解决方法
1.获取数字上的每一位数字
代码如下:
temp = 0;
while (num)//获取num中各个位置上的数字
{
arr[3 - temp] = num % 10;
num /= 10;
temp++;
}
2.分别赋值给两个数组并排序
代码如下(最简单的冒泡排序):
for (int i = 0; i < 4; i++)//赋值给两个数组,可简化为一个数组,分别用两个数字储存排序后的结果
{
arr_min[i] = arr[i];
arr_max[i] = arr[i];
}
for (int i = 0; i < 4; i++)//排序大到小
{
for (int j = 0; j < 4 - i - 1; j++)
{
if (arr_max[j] < arr_max[j + 1])
{
temp = arr_max[j];
arr_max[j] = arr_max[j + 1];
arr_max[j + 1] = temp;
}
}
}
for (int i = 0; i < 4; i++)//排序小到大
{
for (int j = 0; j < 4 - i - 1; j++)
{
if (arr_min[j] > arr_min[j + 1])
{
temp = arr_min[j];
arr_min[j] = arr_min[j + 1];
arr_min[j + 1] = temp;
}
}
}
3.将数组内容转化为数字并取差
for (int i = 0; i < 4; i++)//转换为数字
{
num_max += (int)arr_max[i] * pow(10, (double)(3 - i));
}
for (int i = 0; i < 4; i++)
{
num_min += (int)arr_min[i] * pow(10, (double)(3 - i));
}
num = num_max - num_min;//取差
4.重复执行,直到出现6174,总代码如下
int num_max=0;//储存大到小排序的数字
int num_min=0;//小到大
int arr[4];//储存输入的数字每一位的值
int arr_min[4];//储存小到大每一位值
int arr_max[4];
int temp=0;
int num=1001;//输入的数字
int frequency=0;//执行的次数
while (num!=6174&&num>1000)
{
temp = 0;
while (num)//获取num中各个位置上的数字
{
arr[3 - temp] = num % 10;
num /= 10;
temp++;
}
//arr[0] = num / 1000;//num%1/100
//arr[1] = num % 1000 / 100;
//arr[2] = num % 100 / 10;
//arr[3] = num % 10;
for (int i = 0; i < 4; i++)//赋值给两个数组,可简化为一个数组,分别用两个数字储存排序后的结果
{
arr_min[i] = arr[i];
arr_max[i] = arr[i];
}
for (int i = 0; i < 4; i++)//排序大到小
{
for (int j = 0; j < 4 - i - 1; j++)
{
if (arr_max[j] < arr_max[j + 1])
{
temp = arr_max[j];
arr_max[j] = arr_max[j + 1];
arr_max[j + 1] = temp;
}
}
}
for (int i = 0; i < 4; i++)//排序小到大
{
for (int j = 0; j < 4 - i - 1; j++)
{
if (arr_min[j] > arr_min[j + 1])
{
temp = arr_min[j];
arr_min[j] = arr_min[j + 1];
arr_min[j + 1] = temp;
}
}
}
for (int i = 0; i < 4; i++)//转换为数字
{
num_max += (int)arr_max[i] * pow(10, (double)(3 - i));
}
for (int i = 0; i < 4; i++)
{
num_min += (int)arr_min[i] * pow(10, (double)(3 - i));
}
num = num_max - num_min;//取差
num_max = 0;
num_min = 0;
printf("%d ", num);
frequency++;
}
printf("共执行了%d次", frequency);