鱼C论坛

 找回密码
 立即注册
查看: 2676|回复: 21

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

[复制链接]
发表于 2020-12-13 00:21:26 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 yexing 于 2020-12-13 00:27 编辑

原题:
11.png
我的代码:
#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;
}
输出:
22.png
问题:
输出结果不对,请问我的代码有什么问题?
最佳答案
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;
}

最佳答案

查看完整内容

这个程序用不着弄得这么复杂,如果 a、b、c、d 四个数可以自由移动,才需要循环,并可以得出32种完成算式方案;如果 a、b、c、d 四个数不可以自由移动,就只要将 +、-、* 三个运算移动到不同的位置即可得出两种方案。程序如下:

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-13 07:01:41 From FishC Mobile | 显示全部楼层
加减乘除的优先级,你看样例1+2*3-4在你的代码就变成了(1+2)*3-4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-13 09:10:42 | 显示全部楼层
baige 发表于 2020-12-13 07:01
加减乘除的优先级,你看样例1+2*3-4在你的代码就变成了(1+2)*3-4

啊,好的谢谢,我来改改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-13 09:41:45 | 显示全部楼层
昨天这个帖子是在普通的求助区的,我编写好程序,准备来回答时,却发现帖子不见了。

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

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

也正是因为这个原因,有些本来可以回答你问题的朋友,却不会来回答你的问题,因为编写好程序,还要调试,最后得到几个鱼币,太浪费时间了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

十分感谢指明思路!
但我在想这个算式是不是可以重复填入某个运算符号,例如 a+b+c+d,但你这个程序里似乎没有考虑这种情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

好的好的,以后会注意
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[5],count = 0;
        for(a = 0;a < 5;a++)
        scanf("%d", &arr[a]);  // 控制符中间不要留空格,输入时用空格隔开就行了

        m = arr[4];
        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[a] + arr[b] - arr[c] * arr[d])
                                                        count++;
                                                if (m == arr[a] + arr[b] * arr[c] - arr[d])
                                                        count++;
                                                if (m == arr[a] * arr[b] + arr[c] - arr[d])
                                                        count++;
                                                if (m == arr[a] * arr[b] - arr[c] + arr[d])
                                                        count++;
                                                if (m == arr[a] - arr[b] + arr[c] * arr[d])
                                                        count++;
                                                if (m == arr[a] - arr[b] * arr[c] + arr[d])
                                                        count++;
                                        }
                                }
                        }
                }
        }

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

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

三个运算符,在不同的位置,就有六种排列,没有重复的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-13 10:09:11 | 显示全部楼层
风过无痕1989 发表于 2020-12-13 10:02
三个运算符,在不同的位置,就有六种排列,没有重复的!

题里也没说一定要三个运算符都填啊(捂脸)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

啊谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

三个运算不都填上,运算符又不能重复使用,四个数就没法全部用上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

题里面没说运算符不能重复使用啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-13 10:41:07 | 显示全部楼层
yexing 发表于 2020-12-13 10:17
题里面没说运算符不能重复使用啊

你将帖子再改回普通求助吧,这样,你就不需要付出那10个鱼币了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

改不回去除非删帖重发
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

好像也删不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

……真的就在乎那点技术值吗?只是数据而已,不要把他看得太重。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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个条件添加进程序即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

跟我一个人说,没有用的,你看看论坛上的悬赏帖子,有几个人回答的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


普通提问帖没人理的也不少,但是悬赏贴会一直挂在首页,所以就很显眼了。
而且悬赏贴很多有一些奇怪的需求,没人答也不奇怪。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 12:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表