C++模拟“数字黑洞”

这一小节有点难,看不懂可以跳过哦。

目录

我又双叒叕来啦||ヽ(* ̄▽ ̄*)ノミ|Ю

什么是“数字黑洞”?

目标:

怎么做?

        1、枚举随机数

        2、排序

        3、计算四位数

        4、重点来了:判断!

          5、统计方案:

           6、判断是否找到方案

完整代码:


我又双叒叕来啦||ヽ(* ̄▽ ̄*)ノミ|Ю

        今天我们聊聊数字黑洞这道题目,说实话这道题还挺有趣的。

C++模拟“数字黑洞”_第1张图片

什么是“数字黑洞”?

 · 数字黑洞是指一些数字经过某些运算后而进入死循环。

 · 随机选择4个数字(不可相同)按照从大到小排成一个数字,再用这个数字减去从小到大排成的数字,再把结果包括的数字按照以上步骤继续。最后7步必得包括6、1、4、7的数字,即7641 - 1467 = 6147,仿佛掉进了黑洞,永远都出不来!

目标:

        这道题希望能够列出来有没有能够不陷入“数字黑洞”的方案。

怎么做?

        1、枚举随机数

                我们可以使用枚举算法(又叫做穷举),四位数上每一位的数字。首先得有一些循环变量:

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++)
                {   

                        ......

                }

        }

}

        2、排序

                排序很简单。这里我使用快排,并且定义两个快排函数:

                从小到大排序:

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]。

        3、计算四位数

                我们首先定义一个四位数变量:

int num; 

                再来计算四位数是多少:

num = (a * 1000 + b * 100 + c * 10 + d) - (a2 * 1000 + b2 * 100 + c2 * 10 + d2) ;

        4、重点来了:判断!

                判断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)

          5、统计方案:

                首先得定义一个统计变量:

int sum;

                如果上述条件为真,那么:

sum++;
cout << a * 1000 + b * 100 + c * 10 + d << "-" << a2 * 1000 + b2 * 100 + c2 * 10 + d2 << "\n";

           6、判断是否找到方案

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;
}

不说了,晚安~~~~~~     (¦>[▓▓] 呼呼呼……

你可能感兴趣的:(普普通通的程序,C++实战,c++,算法,数据结构)