常用算法总结(1)—枚举算法
admin 于 2017年06月17日 发表在 C/C++开发笔记

写在前面:

前几天看到一本书《常用算法深入学习实录》,当时就想,是否可以考虑基于这本书的框架构建个人对于常用算法的一个总结呢?因此,便有了这一系列的博文。尽管博文中的整个算法结构来源于此书,但实际操作中对于算法中个人认为不太好的地方,做了一定的修改。

1.枚举算法,就是将所有可能的答案列举出来,然后通过一定的条件判断得出答案是否符合预设,根据判定的结果,保留合适的,否则丢弃。也是在处理问题时,人们最先可能想到的一种算法。

2.流程图示意

3.问题提出

任意5个数字,通过 + - * / 四则运算后,输出结果等于预设的值,输出所有可能的配对组合方式。

4.源码举例:

#include <stdio.h>

//计算输出
//实现方法:
//比如:5 + 5 + 5 -5 -5 = 5
void CalAllResult(int *num, int result)
{
    int j,i[4]; //循环变量 ,数组i用来表示4个运算符
    int sign,count=0;//累加运算时的符号
    float left,right; //保存中间结果
    char oper[4]= {'+','-','*','/'}; //运算符

    //轮询,将每次可能的+,-,*,/序列存储到i[4]中
    for(i[0]=0; i[0]<4; i[0]++) //第一次对应四种运算轮询
    {
        if((i[0]==3)&&(num[1]==0)){}  //第二位除数为0,剔除
        else
        {
            for(i[1]=0; i[1]<4; i[1]++)
            {
                if((i[1]==3)&&(num[2]==0)){}  //第三位除数为0,剔除
                else
                {
                    for(i[2]=0; i[2]<4; i[2]++)
                    {
                        if((i[2]==3)&&(num[3]==0)){}  //第四位除数为0,剔除
                        else
                        {
                            for(i[3]=0; i[3]<4; i[3]++)
                            {
                                if((i[3]==3)&&(num[4]==0)){}  //第五位除数为0,剔除
                                else
                                {
                                    left=0;
                                    sign=1;
                                    right=num[0];    //序列的第一个数字

                                    //接下来利用i[4]数组中存储的计算符号,进行运算
                                    //先乘除后加减
                                    for(j=0; j<4; j++)
                                    {
                                        //例如:5*5+5-5*5=5
                                        //(1): j=0, right = right*num[j+1] = num[0]*num[1] = 5*5 =25
                                        //(2): j=1, left = left+sign*right = 0+1*25 = 25 ,right=5
                                        //(3): j=2, left = left+sign*right = 25+1*5 = 30, right=5
                                        //(4): j=3, right = right*num[j+1] = 5*5 = 25
                                        switch(oper[i[j]])    //判断i[]数组中的加减乘除符号
                                        {
                                        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;
                                        }
                                    }
                                    //最后的一次加减运算
                                    //例如:5*5+5-5*5=5
                                    //left+sign*right = 30-25 = 5
                                    if(left+sign*right==result)
                                    {
                                        count++;
                                        printf("%3d:",count);
                                        for(j=0; j<4; j++){ printf("%d%c",num[j],oper[i[j]]); }
                                        printf("%d=%d\n",num[4],result);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    if(count==0) { printf("没有符合要求的方法!\n"); }
    getch();
}


int main(void)
{
    //result -> 结果
    //value[6] -> 存储输入数据
    int j,result,value[5];

    //用户输入值
    printf("输入5个数,之间用空格隔开:");
    for(j=0; j<5; j++){ scanf("%d",&value[j]); }

    //运算结果值
    printf("输入结果:");
    scanf("%d",&result);

    //计算函数
    CalAllResult(value, result);

    return 0;
}

4.调试输出:

注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。 标签:常用算法,处理算法