LQ0064 9数算式枚举

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0064 9数算式枚举相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2017初赛 Java A组H题

题目描述
观察如下的算式:9213 x 85674 = 789314562
左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。
而乘积恰好也是用到了1~9的所有数字,并且每个1次。
请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个?
注意:

  1. 总数目包含题目给出的那个示例。
  2. 乘数和被乘数交换后作为同一方案来看待。

输出格式
输出一个整数表示答案

问题分析
用枚举法来实现。

AC的C++语言程序如下:

/* LQ0064 9数算式 */

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

int a[] = 1, 2, 3, 4, 5, 6, 7, 8, 9;

bool judge(int n)

    bool flag[10];
    memset(flag, false, sizeof flag);
    while (n) 
        int d = n % 10;
        if (d == 0) return false;
        if (flag[d]) return false;
        flag[d] = true;
        n /= 10;
    
    for (int i = 1; i <= 9; i++)
        if (flag[i] == false) return false;
    return true;


int main()

    int cnt = 0, t1, t2;
    do 
        // 1 + 8
        t1 = a[0];
        t2 = a[1] * 10000000 + a[2] * 1000000 + a[3] * 100000 + a[4] * 10000 +
                a[5] * 1000 + a[6] * 100 + a[7] * 10 + a[8];
        if (judge(t1 * t2)) cnt++;

        // 2 + 7
        t1 = t1 * 10 + a[1];
        t2 %= 10000000;
        if (judge(t1 * t2)) cnt++;

        // 3 + 6
        t1 = t1 * 10 + a[2];
        t2 %= 1000000;
        if (judge(t1 * t2)) cnt++;

        // 4 + 5
        t1 = t1 * 10 + a[3];
        t2 %= 100000;
        if (judge(t1 * t2)) cnt++;
     while (next_permutation(a, a + 9));

    printf("%d\\n", cnt);

    return 0;

以上是关于LQ0064 9数算式枚举的主要内容,如果未能解决你的问题,请参考以下文章

LQ0066 算式900枚举

LQ0268 古堡算式枚举+进制

LQ0268 古堡算式枚举+进制

LQ0205 马虎的算式枚举+进制

LQ0192 神奇算式填空题

LQ0023 三羊献瑞枚举