【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 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;
} 加减乘除的优先级,你看样例1+2*3-4在你的代码就变成了(1+2)*3-4 baige 发表于 2020-12-13 07:01
加减乘除的优先级,你看样例1+2*3-4在你的代码就变成了(1+2)*3-4
啊,好的谢谢,我来改改 昨天这个帖子是在普通的求助区的,我编写好程序,准备来回答时,却发现帖子不见了。
求助问题,还是普通求助比较好,悬赏求助不如普通求助,这是本论坛的一个不合理的地方。它们的区别:
悬赏求助,你选为最佳答案后,除得到你这悬赏10个鱼币,什么都没有了
而普通求助,你选为最佳答案后,系统给我们的奖励是:鱼币+3,荣誉+2,技术值+1
能回答你问题的朋友们,在论坛混久了,谁会缺这几个鱼币?他们更多的是想得到 技术+1,因为在本论坛,只有技术值是买不来的,只有脚踏实地回答问题(不能是悬赏问题),然后被选为最佳答案,才能得到。
也正是因为这个原因,有些本来可以回答你问题的朋友,却不会来回答你的问题,因为编写好程序,还要调试,最后得到几个鱼币,太浪费时间了 风过无痕1989 发表于 2020-12-13 09:27
这个程序用不着弄得这么复杂,如果 a、b、c、d 四个数可以自由移动,才需要循环,并可以得出32种英语培训; ...
十分感谢指明思路!
但我在想这个算式是不是可以重复填入某个运算符号,例如 a+b+c+d,但你这个程序里似乎没有考虑这种情况 风过无痕1989 发表于 2020-12-13 09:41
昨天这个帖子是在普通的求助区的,我编写好程序,准备来回答时,却发现帖子不见了。
求助问题,还是普通 ...
好的好的,以后会注意 下面的程序是我昨晚写的, 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;
} yexing 发表于 2020-12-13 09:51
十分感谢指明思路!
但我在想这个算式是不是可以重复填入某个运算符号,例如 a+b+c+d,但你这个程序里似 ...
三个运算符,在不同的位置,就有六种排列,没有重复的! 风过无痕1989 发表于 2020-12-13 10:02
三个运算符,在不同的位置,就有六种排列,没有重复的!
题里也没说一定要三个运算符都填啊(捂脸) 风过无痕1989 发表于 2020-12-13 10:01
下面的程序是我昨晚写的, a, b, c, d 四个数可以任意调整位置。既然已经写了,还是给你吧
啊谢谢{:10_275:}{:10_275:} yexing 发表于 2020-12-13 10:09
题里也没说一定要三个运算符都填啊(捂脸)
三个运算不都填上,运算符又不能重复使用,四个数就没法全部用上 风过无痕1989 发表于 2020-12-13 10:12
三个运算不都填上,运算符又不能重复使用,四个数就没法全部用上
题里面没说运算符不能重复使用啊{:10_262:} yexing 发表于 2020-12-13 10:17
题里面没说运算符不能重复使用啊
你将帖子再改回普通求助吧,这样,你就不需要付出那10个鱼币了 风过无痕1989 发表于 2020-12-13 10:41
你将帖子再改回普通求助吧,这样,你就不需要付出那10个鱼币了
改不回去{:10_262:}除非删帖重发 风过无痕1989 发表于 2020-12-13 10:41
你将帖子再改回普通求助吧,这样,你就不需要付出那10个鱼币了
好像也删不了 风过无痕1989 发表于 2020-12-13 09:41
昨天这个帖子是在普通的求助区的,我编写好程序,准备来回答时,却发现帖子不见了。
求助问题,还是普通 ...
……真的就在乎那点技术值吗?只是数据而已,不要把他看得太重。 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个条件添加进程序即可 永恒的蓝色梦想 发表于 2020-12-13 12:23
……真的就在乎那点技术值吗?只是数据而已,不要把他看得太重。
跟我一个人说,没有用的,你看看论坛上的悬赏帖子,有几个人回答的? 风过无痕1989 发表于 2020-12-13 12:29
跟我一个人说,没有用的,你看看论坛上的悬赏帖子,有几个人回答的?
普通提问帖没人理的也不少,但是悬赏贴会一直挂在首页,所以就很显眼了。
而且悬赏贴很多有一些奇怪的需求,没人答也不奇怪。
页:
[1]
2