Num.2 枚举(穷举)算法

本文介绍了枚举法的基本概念及应用,通过填数游戏和填运算符两个具体实例展示了如何利用枚举法解决问题。文章提供了完整的C语言代码示例,并详细解释了代码逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法思路

枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件:

- 可预先确定候选答案的数量;
- 候选答案的范围在求解之前必须有一个确定的集合。
实例1:填数游戏
算法描述题
x 算
—————
题题题题题题
#include "stdafx.h"
#include <stdio.h>

int main()
{
    int n1, n2, n3, n4, n5;
    long multi, result;

    for (n1 = 1; n1 <= 9; n1++)
        for (n2 = 0; n2 <= 9; n2++)
            for (n3 = 0; n3 <= 9; n3++)
                for (n4 = 0; n4 <= 9; n4++)
                    for (n5 = 0; n5 <= 9; n5++)
                    {
                        multi  = n1*10000 +n2*1000 +n3*100 +n4*10 +n5;
                        result = n5*100000+n5*10000+n5*1000+n5*100+n5*10+n5;
                        if (result == multi*n1)
                        {
                            printf("\n%5d%2d%2d%2d%2d\n", n1, n2, n3, n4, n5);
                            printf("X%12d\n", n1);
                            printf("_____________\n");
                            printf("%3d%2d%2d%2d%2d%2d\n",n5,n5,n5,n5,n5,n5);
                        }
                    }
    getchar();
    return 0;
}
实例2:填运算符
5 5 5 5 5=5
由于算术表达式的特殊性,在编程求解时,注意:
- 当填入除号时,要求右侧的数不能为0
- 乘除运算级别比加减高
5+5-5*5/5 = 5
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

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("Please input 5 number: ");
    for (j = 1; j <= 5; j++)
    {
        /*
            为什么不用scanf()
            使用scanf的警告是vs认为scanf函数本身不安全,建议使用scanf_s 
        */
        scanf_s("%d", &num[j]);
    }
    printf("Please input result:");
    scanf_s("%d",&result);

    for (i[1] = 1; i[1] <= 4; i[1]++) //循环四种运算, 1+, 2-, 3*, 4/
        if ((i[1] < 4) || (num[2] != 0)) //运算符若是/,则第二个运算数不能为0
            for (i[2] = 1; i[2] <= 4; i[2]++)
                if ((i[2] < 4) || (num[3] != 0))
                    for (i[3] = 1; i[3] <= 4; i[3]++)
                        if ((i[3] < 4) || (num[4] != 0))
                            for (i[4] = 1; i[4] <= 4; i[4]++)
                                if ((i[4] < 4) || (num[5] != 0))
                                {
                                    left = 0;
                                    right = num[1];
                                    sign = 1;
                                    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("No!\n");    
    while(getchar()!='q'); //输入小字字母 'q'退出
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值