观察如下的算式:
9213 x 85674 = 789314562
左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。
而乘积恰好也是用到了1~9的所有数字,并且每个1次。
请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个?
注意:
1.总数目包含题目给出的那个示例。
2.乘数和被乘数交换后作为同一方案来看待。
程序说明:
生成9的全排列,然后分割成两部分a和b(用隔板法),判断a × b是否满足题意。
注意最后的答案要除以2。正确答案:1625
代码如下:
#include <iostream>
#include <cstring>
using namespace std;
//st数组判断1~9有没有用过,res数组用于存储9的全排列
//book数组用于记录1~9每个数字用过的次数
int st[10], res[10], book[10], cnt;
//将一个数字分割成两部分
int cal(int l, int r) {
int t = 0;
for(int i = l; i <= r; i++) {
t = t * 10 + res[i];
}
return t;
}
//判断某数字中1~9是否都出现过一次
bool check(int k) {
for(int i = 0; i < 10; i++)
book[i] = 0;
while(k) {
book[k % 10]++;
k /= 10;
}
bool flag = true;
for(int i = 1; i <= 9; i++) {
if(book[i] != 1)
flag = false;
}
return flag;
}
//生成9的全排列
void dfs(int k) {
if(k == 9) {
for(int i = 0; i < 8; i++) {
int a = cal(0, i);
int b = cal(i + 1, 8);
if(check(a * b)) {
cout<<a<<" * "<<b<<" = "<<a * b<<endl;
cnt++;
}
}
return;
}
for(int i = 1; i <= 9; i++) {
if(!st[i]) {
st[i] = 1;
res[k] = i;
dfs(k + 1);
st[i] = 0;
}
}
}
int main() {
dfs(0);
cout<<cnt; //输出3250
return 0;
}