问题描述
小明的作业本上有道思考题:
看下面的算式:
(□□□□-□□□□)*□□=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