首页 新闻 会员 周边

初中数学题编程求解

0
悬赏园豆:50 [已解决问题] 解决于 2023-01-10 08:12

□□*□□+□□/□□-□□=2023
□是0-9,不得重复
请用Python求出所有解(3000ms以内)

山光的主页 山光 | 初学一级 | 园豆:144
提问于:2023-01-08 19:33

中间那个除法肯定是要求能够整除吧,我觉得可以先确定这4个数字,后面的就在剩余6个里选,范围小一点,可能速度会快一些

会长 1年前

@会长: 嗯,主要是懒得做,有同事问我

山光 1年前

@山光: 你同事估计也是别人问他的....

会长 1年前

@会长: 挺麻烦的,有56种整除
我同事直接暴力,要算100亿次

山光 1年前

@山光: 穷举100亿次...他估计没动过脑;相乘的2位数要在1924~2122 之间 ,然后分母不能为0,同为个位数的情况不能出现,不能被 11 整除,这就可以剔除很多无效穷举

〆灬丶 1年前

@〆灬丶: 他大学不好好上,还是那句话,现在的年轻人难带啊

山光 1年前

@〆灬丶: 进公司一个月还不会变量有意义

山光 1年前

@山光: 这和 "大学不好好上" 也没啥关系吧,学习这种事情真的很难说;另外你指的年轻人也不知道是哪一年的,如果是疫情这批毕业的,确实难;我当年在校都是逃课、开小差,何况他们1~2年的网课

〆灬丶 1年前

@〆灬丶: 我在英国南安普顿大学留学,只上了两年不到就毕业了,还拿了奖学金,那同事跟我同岁,出来三四年了

山光 1年前
< >
分享
最佳答案
1
# □□*□□+□□/□□-□□=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)
收获园豆:30
落痕的寒假 | 菜鸟二级 |园豆:232 | 2023-01-09 11:29

不错

山光 | 园豆:144 (初学一级) | 2023-01-10 08:08
其他回答(2)
3

我用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");
        }
收获园豆:15
中华鲟3670 | 园豆:847 (小虾三级) | 2023-01-09 12:01

用 Python 跑了你这版,耗时:0.3731318
pypy 可能再快点,可惜我电脑没装

支持(0) 反对(0) 〆灬丶 | 园豆:2287 (老鸟四级) | 2023-01-09 15:02

可以

支持(0) 反对(0) 山光 | 园豆:144 (初学一级) | 2023-01-10 08:07
0

我用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;
}
收获园豆:5
yuitoTDF | 园豆:216 (菜鸟二级) | 2023-01-09 17:35

10个for循环+if 嵌套,好壮观啊,不过C++ 效率确实是比C# 要高

支持(0) 反对(0) 中华鲟3670 | 园豆:847 (小虾三级) | 2023-01-09 18:25

@中华鲟3670: 对对对

支持(0) 反对(0) 山光 | 园豆:144 (初学一级) | 2023-01-10 08:05

这是...暴力

支持(0) 反对(0) 山光 | 园豆:144 (初学一级) | 2023-01-10 08:06

python 这方面确实难顶;我感觉矩阵应该也能求解,使用 numpy 应该也很快,它底层是C写的

支持(0) 反对(0) 〆灬丶 | 园豆:2287 (老鸟四级) | 2023-01-10 09:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册