菜☞鸟 2019-05-06 11:35 采纳率: 100%
浏览 334

C++程序设计算法解决问题

问题描述:在下面的算式中,添加“+”、“-”,“*”,“/”,4个运算符,使得这个式子成立。
5 5 5 5 5=5
注意:不用枚举算法,还可以用什么算法,以下是枚举算法的代码,求别的算法解决问题的代码
#include

int main()
{
int j, i[5]; // 循环变量,数组i用来表示4个运算符
int sign; // 累加运算时的符号;
int result; // 保存运算式子的结果值
int count=0; // 计数器,统计符合条件的方案
int num[6]; // 保存操作数
float left, right; //保存中间结果
char oper[5] = { ' ','+','-','*','/' }; //运算符

printf("输入5个数,之间用空格隔开:");
for (j = 1; j <= 5; j++)
    scanf_s("%d",&num[j]);
printf("输入结果:");
scanf_s("%d",&result);
//注:这里i[1]代表的第一个运算符的意思,i[1]=1代表第一个运算符是“+”,i[1]=2代表第一个运算符是“减”,i[1]=3代表第一个运算符是“-”,i[1]=4代表第一个运算符是“/”
//注:这里i[2]代表的第二个运算符的意思,i[2]=1代表第二个运算符是“+”,i[2]=2代表第二个运算符是“减”,i[2]=3代表第二个运算符是“-”,i[2]=4代表第二个运算符是“/”
//i[3],i[4]依次类推。
for (i[1]=1; i[1]<=4; i[1]++)    //循环4种运算符,1表示+,2表示-,3表示*,4表示/
{
    if ((i[1]<4) || (num[2] != 0))  //运算符若是/,则第二个运算数不能为0,(注:“||”是或运算,两个条件至少要有一个成立,即第一个运算符为/时,第二个运算数不为0)
    {
        for (i[2]=1; i[2]<=4; i[2]++)
        {
            if ((i[2]<4)||(num[3]!= 0))     //当第二个运算符为/时,第三个运算数不为0
            {
                for (i[3] = 1; i[3] <= 4; i[3]++)
                {
                    if ((i[3] < 4) ||( num[4] != 0))    //当第三个运算符为/时,第四个运算数不为0
                    {
                        for (i[4] = 1; i[4] <= 4; i[4]++)
                        {
                            if ((i[4] < 4) || (num[5] != 0))    //当第四个运算符为/时,第五个运算数不为0
                            {
                                left = 0;
                                right = num[1];
                                sign = 1;
                                //使用case语句,将4种运算符填到对应的空格位置,并进行计算
                                for (j = 1; j <= 4; j++)
                                {
                                    switch (oper[i[j]])
                                    {
                                    case '+':
                                        left = left + sign*right;
                                        sign = 1;
                                        right = num[j + 1];
                                        break;
                                    case '-':
                                        left = left + sign*right;
                                        sign = -1;
                                        right = num[j + 1];
                                        break;
                                    case '*':
                                        right = right*num[j + 1];
                                        break;
                                    case '/':
                                        right = right / num[j + 1];
                                        break;
                                    }
                                }
                                //开始判断,如果运算式子的结果和输入的结果相同,则表示找到一种算法,并输出这个解
                                if (left + sign*right == result)
                                {
                                    count++;
                                    printf("%3d:",count);
                                    for (j = 1; j <= 4; j++)
                                        printf("%d%c",num[j],oper[i[j]]);
                                    printf("%d=%d\n",num[5],result);
                                }
                            }
                        }
                    }

                }
            }
        }
    }
}
if (count == 0)
    printf("没有符合要求的方法!\n");
system("pause");
return 0;

}

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-05-06 11:44
    关注

    用递归实现,代码看我之前的回答。
    简单来说,
    5 5 5 5 5 = 5
    可以转换成
    10 5 5 5 = 5
    0 5 5 5 = 5
    25 5 5 5 = 5
    1 5 5 5 = 5
    这样4个问题
    而10 5 5 5 = 5又可以转换为
    15 5 5 = 5
    5 5 5 = 5
    50 5 5 = 5
    2 5 5 = 5
    ...

    评论

报告相同问题?

悬赏问题

  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)