ConstStar
发布于 2022-09-04 / 164 阅读 / 0 评论 / 0 点赞

蓝桥杯2017年C组:算式900

问题描述

小明的作业本上有道思考题:
看下面的算式:
(□□□□-□□□□)*□□=900
其中的小方块代表09的数字,这10个方块刚好包含了09中的所有数字。
注意:0不能作为某个数字的首位。
小明经过几天的努力,终于做出了答案!如下:
(5012-4987)*36=900
用计算机搜索后,发现还有另外一个解,本题的任务就是:请你算出这另外的一个解。
注意:提交的格式需要与示例严格一致;
括号及运算符号不要用中文输入法;
整个算式中不能包含空格。

解题方案

思路

全排列

代码

#include <iostream>
#include <algorithm>

using namespace std;

bool check(int arr[], int &n1, int &n2, int &n3) {
    if (arr[0] == 0 || arr[4] == 0 || arr[8] == 0)
        return false;

    n1 = arr[0] * 1000 + arr[1] * 100 + arr[2] * 10 + arr[3];
    n2 = arr[4] * 1000 + arr[5] * 100 + arr[6] * 10 + arr[7];
    n3 = arr[8] * 10 + arr[9];


    return (n1 - n2) * n3 == 900;
}

//手动全排列
void fun(int arr[], int index, int len) {

    if (index == len) {
        int n1, n2, n3;
        if (check(arr, n1, n2, n3)) {
            printf("(%d-%d)*%d=900\n", n1, n2, n3);
        }
    }

    for (int i = index; i < len; ++i) {
        {
            int temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }
        if (!(arr[0] == 0 || arr[4] == 0 || arr[8] == 0))   //加速
            fun(arr, index + 1, len);

        {
            int temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }
    }


}


int main() {

    int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

//    do {
//        int n1, n2, n3;
//        if (check(arr, n1, n2, n3)) {
//            printf("(%d-%d)*%d=900\n", n1, n2, n3);
//        }
//    } while (next_permutation(arr, arr + 10));

    fun(arr, 0, 10);

    return 0;
}

输出

(5012-4987)*36=900
(6048-5973)*12=900


评论