这一小节有点难,看不懂可以跳过哦。
目录
我又双叒叕来啦||ヽ(* ̄▽ ̄*)ノミ|Ю
什么是“数字黑洞”?
目标:
怎么做?
1、枚举随机数
2、排序
3、计算四位数
4、重点来了:判断!
5、统计方案:
6、判断是否找到方案
完整代码:
今天我们聊聊数字黑洞这道题目,说实话这道题还挺有趣的。
· 数字黑洞是指一些数字经过某些运算后而进入死循环。
· 随机选择4个数字(不可相同)按照从大到小排成一个数字,再用这个数字减去从小到大排成的数字,再把结果包括的数字按照以上步骤继续。最后7步必得包括6、1、4、7的数字,即7641 - 1467 = 6147,仿佛掉进了黑洞,永远都出不来!
这道题希望能够列出来有没有能够不陷入“数字黑洞”的方案。
我们可以使用枚举算法(又叫做穷举),四位数上每一位的数字。首先得有一些循环变量:
int a, b, c, d;
顺便定义一个NUM常量,循环到9。如下:
#define NUM 9
具体可以这样写:
for (a = 0; a <= NUM; a++){
for (b = 0; b <= NUM; b++){
for (c = 0; c <= NUM; c++){
for (d = 0; d <= NUM; d++)
{......
}
}
}
排序很简单。这里我使用快排,并且定义两个快排函数:
从小到大排序:
void sequence(int left, int right)
{
int i, j, t, temp;
if (left > right)
return;
temp = n[left];
i = left;
j = right;
while (1)
{
if (i == j)
break;
while (n[j] >= temp && i < j)
j--;
while (n[i] <= temp && i < j)
i++;
if (i < j)
{
t = n[i];
n[i] = n[j];
n[j] = t;
}
}
n[left] = n[i];
n[i] = temp;
sequence (left, i - 1);
sequence (i + 1, right);
}
从大到小排序:
void sequence2(int left, int right)
{
int i, j, t, temp;
if (left > right)
return;
temp = n[left];
i = left;
j = right;
while (1)
{
if (i == j)
break;
while (n[j] <= temp && i < j)
j--;
while (n[i] >= temp && i < j)
i++;
if (i < j)
{
t = n[i];
n[i] = n[j];
n[j] = t;
}
}
n[left] = n[i];
n[i] = temp;
sequence2 (left, i - 1);
sequence2 (i + 1, right);
}
哦,忘了说了,还要定义四位数数组n[5]。
我们首先定义一个四位数变量:
int num;
再来计算四位数是多少:
num = (a * 1000 + b * 100 + c * 10 + d) - (a2 * 1000 + b2 * 100 + c2 * 10 + d2) ;
判断a b c d是否互不相同并且不等于6147(的每一位),没错就是酱紫的O(∩_∩)O:
if(num != 7641 && num != 7614 && num != 7461 && num != 7416 && num != 7164 && num != 7146 && num != 6714 && num != 6741 && num != 6417 && num != 6471 && num != 6741 && num != 6714 && num != 6147 && num != 6174 && num != 1467 && num !=1476 && num != 1647 && num != 1674 && num != 1764 && num != 1746 && num != 4617 && num != 4671 && num != 4761 && num != 4716 && num != 4176 && num !=4167 && a != d && a != c && a != b && b != c && b != a && b != d && c != b && c != a && c != d && d != a && d != b && d != c)
首先得定义一个统计变量:
int sum;
如果上述条件为真,那么:
sum++;
cout << a * 1000 + b * 100 + c * 10 + d << "-" << a2 * 1000 + b2 * 100 + c2 * 10 + d2 << "\n";
if(sum == 0)
printf("没有找到方案~\n");
else
printf("找到方案!\n一共找到了%d个方案。\n \n",sum);
#include
#include
#include
#define NUM 9
using namespace std;
int a, b, c, d, sum, num;
int i, j, n[5];
int a2, b2, c2, d2;
void sequence(int left, int right)
{
int i, j, t, temp;
if (left > right)
return;
temp = n[left];
i = left;
j = right;
while (1)
{
if (i == j)
break;
while (n[j] >= temp && i < j)
j--;
while (n[i] <= temp && i < j)
i++;
if (i < j)
{
t = n[i];
n[i] = n[j];
n[j] = t;
}
}
n[left] = n[i];
n[i] = temp;
sequence (left, i - 1);
sequence (i + 1, right);
}
void sequence2(int left, int right)
{
int i, j, t, temp;
if (left > right)
return;
temp = n[left];
i = left;
j = right;
while (1)
{
if (i == j)
break;
while (n[j] <= temp && i < j)
j--;
while (n[i] >= temp && i < j)
i++;
if (i < j)
{
t = n[i];
n[i] = n[j];
n[j] = t;
}
}
n[left] = n[i];
n[i] = temp;
sequence2 (left, i - 1);
sequence2 (i + 1, right);
}
int main()
{
for (a = 0; a <= NUM; a++){
for (b = 0; b <= NUM; b++){
for (c = 0; c <= NUM; c++){
for (d = 0; d <= NUM; d++)
{
n[1] = a;
n[2] = b;
n[3] = c;
n[4] = d;
sequence2(1, 4);
a = n[1];
b = n[2];
c = n[3];
d = n[4];
sequence(1, 4);
a2 = n[1];
b2 = n[2];
c2 = n[3];
d2 = n[4];
num = (a * 1000 + b * 100 + c * 10 + d) - (a2 * 1000 + b2 * 100 + c2 * 10 + d2) ;
if(num != 7641 && num != 7614 && num != 7461 && num != 7416 && num != 7164 && num != 7146 && num != 6714 && num != 6741 && num != 6417 && num != 6471 && num != 6741 && num != 6714 && num != 6147 && num != 6174 && num != 1467 && num != 1476 && num != 1647 && num != 1674 && num != 1764 && num != 1746 && num != 4617 && num != 4671 && num != 4761 && num != 4716 && num != 4176 && num != 4167 && a != d && a != c && a != b && b != c && b != a && b != d && c != b && c != a && c != d && d != a && d != b && d != c){
sum++;
cout << a * 1000 + b * 100 + c * 10 + d << "-" << a2 * 1000 + b2 * 100 + c2 * 10 + d2 << "\n";
}
}
}
}
}
if(sum == 0)
printf("没有找到方案~\n");
else
printf("找到方案!\n一共找到了%d个方案。\n \n",sum);
return 0;
}
不说了,晚安~~~~~~ (¦>[▓▓] 呼呼呼……