□□*□□+□□/□□-□□=2023
□是0-9,不得重复
请用Python求出所有解(3000ms以内)
# □□*□□+□□/□□-□□=2023
# a*b+c/d-e=2023
import time
import itertools
start = time.time()
num = range(0,10)
res = []
# 获得0到10的所有排列
for i in itertools.permutations(num,10):
# 第一位不可能是0或1,得不到2023
if i[0] in [0,1]:
continue
c = i[4]*10 + i[5]
d = i[6]*10 + i[7]
# 中间是否整除
if c%d ==0:
a = i[0]*10 + i[1]
b = i[2]*10 + i[3]
e = i[8]*10 + i[9]
if a*b+c/d-e == 2023:
res.append(i)
# 一般笔记本大概1秒多一点
print(time.time()-start)
不错
我用C# 试写了1个,50ms 左右 ,结果找到34组。
1: 98 * 21 + 56 / 07 - 43 = 2023
2: 85 * 24 + 76 / 01 - 93 = 2023
3: 80 * 26 + 34 / 17 - 59 = 2023
4: 79 * 25 + 84 / 01 - 36 = 2023
5: 79 * 26 + 53 / 01 - 84 = 2023
6: 79 * 26 + 51 / 03 - 48 = 2023
7: 71 * 29 + 68 / 04 - 53 = 2023
8: 71 * 29 + 56 / 08 - 43 = 2023
9: 68 * 30 + 54 / 27 - 19 = 2023
10: 62 * 34 + 85 / 17 - 90 = 2023
11: 60 * 35 + 82 / 41 - 79 = 2023
12: 60 * 35 + 28 / 14 - 79 = 2023
13: 59 * 34 + 68 / 02 - 17 = 2023
14: 56 * 37 + 84 / 02 - 91 = 2023
15: 54 * 39 + 21 / 07 - 86 = 2023
16: 50 * 41 + 76 / 38 - 29 = 2023
17: 50 * 42 + 36 / 18 - 79 = 2023
18: 42 * 50 + 36 / 18 - 79 = 2023
19: 41 * 50 + 76 / 38 - 29 = 2023
20: 39 * 54 + 21 / 07 - 86 = 2023
21: 37 * 56 + 84 / 02 - 91 = 2023
22: 35 * 60 + 82 / 41 - 79 = 2023
23: 35 * 60 + 28 / 14 - 79 = 2023
24: 34 * 59 + 68 / 02 - 17 = 2023
25: 34 * 62 + 85 / 17 - 90 = 2023
26: 30 * 68 + 54 / 27 - 19 = 2023
27: 29 * 71 + 68 / 04 - 53 = 2023
28: 29 * 71 + 56 / 08 - 43 = 2023
29: 26 * 79 + 53 / 01 - 84 = 2023
30: 26 * 79 + 51 / 03 - 48 = 2023
31: 26 * 80 + 34 / 17 - 59 = 2023
32: 25 * 79 + 84 / 01 - 36 = 2023
33: 24 * 85 + 76 / 01 - 93 = 2023
34: 21 * 98 + 56 / 07 - 43 = 2023
AB*CD+EF/GH-JK=2023
public static void Test2()
{
string[] numb = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
List<string> JK = new List<string>();
List<string> ABCD = new List<string>();
List<string> EFGH = new List<string>();
// 组合非重复的数字组合
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (i == j)
continue;
JK.Add(numb[i] + numb[j]);
}
}
int length = JK.Count;
//确定AB,CD 数字范围
for (int i = length - 1; i > 0; i--)
{
int AB = int.Parse(JK[i]);
for (int j = 0; j < length; j++)
{
int CD = int.Parse(JK[j]);
if (JK[i].Contains(JK[j][0]) || JK[i].Contains(JK[j][1]))
continue;
if (AB * CD < (2023 + 98)&& AB * CD > (2023 -98))
{
ABCD.Add(JK[i]);
ABCD.Add(JK[j]);
}
}
}
int abcd_length = ABCD.Count;
//确定EF,GH 数字范围
for (int i = length - 1; i > 0; i--)
{
int EF = int.Parse(JK[i]);
for (int j = 0; j < length; j++)
{
int GH = int.Parse(JK[j]);
if (i < j || i < 10 || EF < GH) continue;
if (JK[i].Contains(JK[j][0]) || JK[i].Contains(JK[j][1])) continue;
if (EF < 12) continue;
if (EF % GH != 0) continue;
EFGH.Add(JK[i]);
EFGH.Add(JK[j]);
}
}
int efgh_length = EFGH.Count;
List<char> chars = new List<char>();
int no=0;
for (int i = 0; i < abcd_length/2; i++)
{
chars.Clear();
chars.Add(ABCD[i * 2][0]);
chars.Add(ABCD[i * 2][1]);
chars.Add(ABCD[i * 2 + 1][0]);
chars.Add(ABCD[i * 2 + 1][1]);
int ab_cd = int.Parse(ABCD[i * 2]) * int.Parse(ABCD[i * 2 + 1]);
for (int j = 0; j < efgh_length/2; j++)
{
chars.Clear();
chars.Add(ABCD[i * 2][0]);
chars.Add(ABCD[i * 2][1]);
chars.Add(ABCD[i * 2 + 1][0]);
chars.Add(ABCD[i * 2 + 1][1]);
if (chars.Contains(EFGH[j * 2][0])) continue;
chars.Add(EFGH[j * 2][0]);
if (chars.Contains(EFGH[j * 2][1])) continue;
chars.Add(EFGH[j * 2][1]);
if ( chars.Contains(EFGH[j * 2 + 1][0]) ) continue;
chars.Add(EFGH[j * 2 + 1][0]);
if (chars.Contains(EFGH[j * 2 + 1][1])) continue;
chars.Add(EFGH[j * 2 + 1][1]);
int ef_gh = int.Parse(EFGH[j * 2]) / int.Parse(EFGH[j * 2 + 1]);
if (ab_cd + ef_gh > 2023+98) continue;
for (int k = 0; k < length; k++)
{
chars.Clear();
chars.Add(ABCD[i * 2][0]);
chars.Add(ABCD[i * 2][1]);
chars.Add(ABCD[i * 2 + 1][0]);
chars.Add(ABCD[i * 2 + 1][1]);
chars.Add(EFGH[j * 2][0]);
chars.Add(EFGH[j * 2][1]);
chars.Add(EFGH[j * 2 + 1][0]);
chars.Add(EFGH[j * 2 + 1][1]);
if (chars.Contains(JK[k][0]) ) continue;
chars.Add(JK[k][0]);
if (chars.Contains(JK[k][1])) continue;
chars.Add(JK[k][1]);
int jk_int = int.Parse(JK[k]);
if (ab_cd + ef_gh - jk_int != 2023) continue;
no++;
//Console.WriteLine("="+ABCD[i * 2] + "*" + ABCD[i * 2+1] + "+" + EFGH[j * 2] + "/" + EFGH[j * 2+1] + "-" + JK[k]) ;
Console.WriteLine(no+": "+ABCD[i * 2] + "*" + ABCD[i * 2+1] + "+" + EFGH[j * 2] + "/" + EFGH[j * 2+1] + "-" + JK[k]+ "=2023") ;
}
}
}
Console.WriteLine();
Console.WriteLine("AB*CD+EF/GH-JK=2023");
}
用 Python 跑了你这版,耗时:0.3731318
pypy 可能再快点,可惜我电脑没装
可以
我用C++写了一个,平均耗时62ms。
程序稍微繁琐,用了10个for+if。
运行效果:
和上面C#的效果差不多,都是34个结果,不过顺序恰好相反。
看了一下上面两位的回答,我和Python答主的思路一样,用数字排除特殊情况,不过Python的for似乎强大了点,像0~9随机分配有专门的方法函数,C++则要用10个for+if。当然可能有更好的写法,我也就不研究了。
而C#的答主似乎是用字符串处理。综合上List去罗列。
代码:clock()
、tstart
用于计时,可删除。
#include <iostream>
#include <string>
using namespace std;
//AB*CD+EF/GH-IJ=2023
//9>=A/B/C/D/E/F/G/H/I/J>=0
//限时:3000ms
#define num(a,b) (a*10+b)
int main()
{
clock_t tstart = clock();
int count = 0;
int a, b, c, d, e, f, g, h, i, j;
for (a = 2; a < 10; a++)//第一位不为0或1,否则得不到2023
for (b = 0; b < 10; b++)
if (b != a)
for (c = 0; c < 10; c++)
if (c != b && c != a)
for (d = 0; d < 10; d++)
if (d != c && d != b && d != a)
for (e = 0; e < 10; e++)
if (e != d && e != c && e != b && e != a)
for (f = 0; f < 10; f++)
if (f != e && f != d && f != c && f != b && f != a)
for (g = 0; g < 10; g++)
if (g != f && g != e && g != d && g != c && g != b && g != a)
for (h = 0; h < 10; h++)
if (h != g && h != f && h != e && h != d && h != c && h != b && h != a)
if (num(e, f) % num(g, h) == 0)//EF/GH是否整除
for (i = 0; i < 10; i++)
if (i != h && i != g && i != f && i != e && i != d && i != c && i != b && i != a)
for (j = 0; j < 10; j++)
if (j != i && j != h && j != g && j != f && j != e && j != d && j != c && j != b && j != a && (num(a, b) * num(c, d) + num(e, f) / num(g, h) - num(i, j)) == 2023)
{
++count;
cout << count << ". " << to_string(num(a, b)) << " * " << to_string(num(c, d)) << " + " << to_string(num(e, f)) << " / " << to_string(num(g, h)) << " - " << to_string(num(i, j)) << " = 2023\n";
}
cout << "Use Time:" << clock() - tstart;
}
10个for循环+if 嵌套,好壮观啊,不过C++ 效率确实是比C# 要高
@中华鲟3670: 对对对
这是...暴力
python 这方面确实难顶;我感觉矩阵应该也能求解,使用 numpy 应该也很快,它底层是C写的
中间那个除法肯定是要求能够整除吧,我觉得可以先确定这4个数字,后面的就在剩余6个里选,范围小一点,可能速度会快一些
– 会长 1年前@会长: 嗯,主要是懒得做,有同事问我
– 山光 1年前、
@山光: 你同事估计也是别人问他的....
– 会长 1年前@会长: 挺麻烦的,有56种整除
– 山光 1年前我同事直接暴力,要算100亿次
@山光: 穷举100亿次...他估计没动过脑;相乘的2位数要在1924~2122 之间 ,然后分母不能为0,同为个位数的情况不能出现,不能被 11 整除,这就可以剔除很多无效穷举
– 〆灬丶 1年前@〆灬丶: 他大学不好好上,还是那句话,现在的年轻人难带啊
– 山光 1年前@〆灬丶: 进公司一个月还不会变量有意义
– 山光 1年前@山光: 这和 "大学不好好上" 也没啥关系吧,学习这种事情真的很难说;另外你指的年轻人也不知道是哪一年的,如果是疫情这批毕业的,确实难;我当年在校都是逃课、开小差,何况他们1~2年的网课
– 〆灬丶 1年前@〆灬丶: 我在英国南安普顿大学留学,只上了两年不到就毕业了,还拿了奖学金,那同事跟我同岁,出来三四年了
– 山光 1年前