yexing 发表于 2020-12-13 00:21:26

【C++】给定四个整数和结果,求不同运算求得结果的方案数量

本帖最后由 yexing 于 2020-12-13 00:27 编辑

原题:

我的代码:
#include<cstdio>
int main()
{
        int a, b, c, d, m;
        int temp, count = 0;
       
        scanf("%d %d %d %d %d", &a, &b, &c, &d, &m);
       
        for(int i = 0; i < 4; i++)
        {
                for(int j = 0; j < 4; j++)
                {
                        for(int k = 0; k < 4; k++)
                        {
                                temp = 0;
                                switch(i)
                                {
                                        case 0: temp = a+b; break;
                                        case 1: temp = a-b; break;
                                        case 2: temp = a*b; break;
                                        case 3: temp = a/b; break;
                                }
                                switch(j)
                                {
                                        case 0: temp += c; break;
                                        case 1: temp -= c; break;
                                        case 2: temp *= c; break;
                                        case 3: temp /= c; break;
                                }
                                switch(k)
                                {
                                        case 0: temp += d; break;
                                        case 1: temp -= d; break;
                                        case 2: temp *= d; break;
                                        case 3: temp /= d; break;
                                }
                                if(temp == m)
                                {
                                        count++;
                                }
                        }
                }
        }
        printf("%d", count);
       
        return 0;
}
输出:

问题:
输出结果不对,请问我的代码有什么问题?

风过无痕1989 发表于 2020-12-13 00:21:27

本帖最后由 风过无痕1989 于 2020-12-13 10:14 编辑

这个程序用不着弄得这么复杂,如果 a、b、c、d 四个数可以自由移动,才需要循环,并可以得出32种完成算式方案;如果 a、b、c、d 四个数不可以自由移动,就只要将 +、-、* 三个运算移动到不同的位置即可得出两种方案。程序如下:
// 在 a, b, c, d 四个数中加上运算符 +、-、* 之一,使算式结果等于 m
#include<stdio.h>
int main()
{
        int a, b, c, d, m;
        int count = 0;
        scanf("%d%d%d%d%d", &a, &b, &c, &d, &m);// 控制符中间不要留空格,输入时用空格隔开就行了

        if (m == a + b - c * d)
                count++;
        if (m == a + b * c - d)
                count++;
        if (m == a * b + c - d)
                count++;
        if (m == a * b - c + d)
                count++;
        if (m == a - b + c * d)
                count++;
        if (m == a - b * c + d)
                count++;

        if (count != 0)
                printf("有 %d 种完成算式的方案\n", count);
        else
                printf("不能完成算式");

        return 0;
}

baige 发表于 2020-12-13 07:01:41

加减乘除的优先级,你看样例1+2*3-4在你的代码就变成了(1+2)*3-4

yexing 发表于 2020-12-13 09:10:42

baige 发表于 2020-12-13 07:01
加减乘除的优先级,你看样例1+2*3-4在你的代码就变成了(1+2)*3-4

啊,好的谢谢,我来改改

风过无痕1989 发表于 2020-12-13 09:41:45

昨天这个帖子是在普通的求助区的,我编写好程序,准备来回答时,却发现帖子不见了。

求助问题,还是普通求助比较好,悬赏求助不如普通求助,这是本论坛的一个不合理的地方。它们的区别:
悬赏求助,你选为最佳答案后,除得到你这悬赏10个鱼币,什么都没有了
而普通求助,你选为最佳答案后,系统给我们的奖励是:鱼币+3,荣誉+2,技术值+1

能回答你问题的朋友们,在论坛混久了,谁会缺这几个鱼币?他们更多的是想得到 技术+1,因为在本论坛,只有技术值是买不来的,只有脚踏实地回答问题(不能是悬赏问题),然后被选为最佳答案,才能得到。

也正是因为这个原因,有些本来可以回答你问题的朋友,却不会来回答你的问题,因为编写好程序,还要调试,最后得到几个鱼币,太浪费时间了

yexing 发表于 2020-12-13 09:51:15

风过无痕1989 发表于 2020-12-13 09:27
这个程序用不着弄得这么复杂,如果 a、b、c、d 四个数可以自由移动,才需要循环,并可以得出32种英语培训; ...

十分感谢指明思路!
但我在想这个算式是不是可以重复填入某个运算符号,例如 a+b+c+d,但你这个程序里似乎没有考虑这种情况

yexing 发表于 2020-12-13 09:51:49

风过无痕1989 发表于 2020-12-13 09:41
昨天这个帖子是在普通的求助区的,我编写好程序,准备来回答时,却发现帖子不见了。

求助问题,还是普通 ...

好的好的,以后会注意

风过无痕1989 发表于 2020-12-13 10:01:08

下面的程序是我昨晚写的, a, b, c, d 四个数可以任意调整位置。既然已经写了,还是给你吧
// 在 a, b, c, d 四个数中加上运算符 +、-、* 之一,使算式结果等于 m
#include<stdio.h>
int main()
{
        int a, b, c, d, m;
        int arr,count = 0;
        for(a = 0;a < 5;a++)
        scanf("%d", &arr);// 控制符中间不要留空格,输入时用空格隔开就行了

        m = arr;
        for (a = 0;a < 4;a++)
        {
                for (b = 0;b < 4;b++)
                {
                        for (c = 0;c < 4;c++)
                        {
                                for (d = 0;d < 4;d++)
                                {
                                        if (a != b && b != c && c != d && a != c && a != d && b != d)
                                        {
                                                if (m == arr + arr - arr * arr)
                                                        count++;
                                                if (m == arr + arr * arr - arr)
                                                        count++;
                                                if (m == arr * arr + arr - arr)
                                                        count++;
                                                if (m == arr * arr - arr + arr)
                                                        count++;
                                                if (m == arr - arr + arr * arr)
                                                        count++;
                                                if (m == arr - arr * arr + arr)
                                                        count++;
                                        }
                                }
                        }
                }
        }

        if (count != 0)
                printf("有 %d 种完成算式的方案\n", count);
        else
                printf("不能完成算式");

        return 0;
}

风过无痕1989 发表于 2020-12-13 10:02:30

yexing 发表于 2020-12-13 09:51
十分感谢指明思路!
但我在想这个算式是不是可以重复填入某个运算符号,例如 a+b+c+d,但你这个程序里似 ...

三个运算符,在不同的位置,就有六种排列,没有重复的!

yexing 发表于 2020-12-13 10:09:11

风过无痕1989 发表于 2020-12-13 10:02
三个运算符,在不同的位置,就有六种排列,没有重复的!

题里也没说一定要三个运算符都填啊(捂脸)

yexing 发表于 2020-12-13 10:09:53

风过无痕1989 发表于 2020-12-13 10:01
下面的程序是我昨晚写的, a, b, c, d 四个数可以任意调整位置。既然已经写了,还是给你吧

啊谢谢{:10_275:}{:10_275:}

风过无痕1989 发表于 2020-12-13 10:12:13

yexing 发表于 2020-12-13 10:09
题里也没说一定要三个运算符都填啊(捂脸)

三个运算不都填上,运算符又不能重复使用,四个数就没法全部用上

yexing 发表于 2020-12-13 10:17:21

风过无痕1989 发表于 2020-12-13 10:12
三个运算不都填上,运算符又不能重复使用,四个数就没法全部用上

题里面没说运算符不能重复使用啊{:10_262:}

风过无痕1989 发表于 2020-12-13 10:41:07

yexing 发表于 2020-12-13 10:17
题里面没说运算符不能重复使用啊

你将帖子再改回普通求助吧,这样,你就不需要付出那10个鱼币了

yexing 发表于 2020-12-13 10:56:27

风过无痕1989 发表于 2020-12-13 10:41
你将帖子再改回普通求助吧,这样,你就不需要付出那10个鱼币了

改不回去{:10_262:}除非删帖重发

yexing 发表于 2020-12-13 10:58:26

风过无痕1989 发表于 2020-12-13 10:41
你将帖子再改回普通求助吧,这样,你就不需要付出那10个鱼币了

好像也删不了

永恒的蓝色梦想 发表于 2020-12-13 12:23:44

风过无痕1989 发表于 2020-12-13 09:41
昨天这个帖子是在普通的求助区的,我编写好程序,准备来回答时,却发现帖子不见了。

求助问题,还是普通 ...

……真的就在乎那点技术值吗?只是数据而已,不要把他看得太重。

风过无痕1989 发表于 2020-12-13 12:27:36

yexing 发表于 2020-12-13 10:17
题里面没说运算符不能重复使用啊

if (m == a - b * c + d)
    count++;
你想要运算符号重复使用,改这个条件呀,比如:
if (m == a + b + c + d)
    count++;
if (m == a - b - c - d)
    count++;
if (m == a * b * c * d)
    count++;
。 。 。
将这9个条件添加进程序即可

风过无痕1989 发表于 2020-12-13 12:29:22

永恒的蓝色梦想 发表于 2020-12-13 12:23
……真的就在乎那点技术值吗?只是数据而已,不要把他看得太重。

跟我一个人说,没有用的,你看看论坛上的悬赏帖子,有几个人回答的?

永恒的蓝色梦想 发表于 2020-12-13 12:35:52

风过无痕1989 发表于 2020-12-13 12:29
跟我一个人说,没有用的,你看看论坛上的悬赏帖子,有几个人回答的?

普通提问帖没人理的也不少,但是悬赏贴会一直挂在首页,所以就很显眼了。
而且悬赏贴很多有一些奇怪的需求,没人答也不奇怪。
页: [1] 2
查看完整版本: 【C++】给定四个整数和结果,求不同运算求得结果的方案数量