算法之暴力求解

迷南。 2022-06-14 08:54 323阅读 0赞

算法之暴力求解

  • 暴力求解的简单解释
  1. * 很多问题都可以”暴力解决”——不用太动脑筋,把所有的可能性都列举出来,然后一一实验。尽管这样的方法显得很”笨”,但却可以常常行之有效。

  • 简单枚举
  1. * 在枚举复杂对象之前,让我们先尝试着枚举一些相对简单的东西,如整数,字串等。
  2. * **除法**:
  3. * 输入正整数n, 按从小到大的顺序排列输出形如abcde/fghij = n的表达式,其中a~j恰好为数字0~9的一个排列,2 <= n <= 79
  4. * 样例输入:
  5. * 62
  6. * 样例输出:
  7. * 79564/01283 = 62
  8. * 94736/01528 = 62
  9. * 分析:
  10. * 枚举0~9的所有排列?没这个必要。只需要枚举fghij就可以算出abcde,然后判断所有数字都不相同即可。不仅程序简单,而且枚举量从10!= 3628800降低点至不到1万。由此可见,即使是采用暴力枚举,也是需要进行认真分析问题的。

  • 代码:

    include

    include

    include

    include

    using namespace std;

    int n;
    int arr[2][5];
    int ans;

    void get_arr(int a[], int num)
    {

    1. for (int i = 4; i > 0; i --) {
    2. a[i] = num%10;
    3. num /= 10;
    4. }
    5. a[0] = num;

    }

    bool check()
    {

    1. int cnt[10] = {

    0};

    1. for (int i = 0; i < 2; i ++) {
    2. for (int j = 0; j < 5; j ++) {
    3. if (arr[i][j] >= 10 || ++cnt[arr[i][j]] > 1) return false;
    4. }
    5. }
    6. return true;

    }

    void print()
    {

    1. for (int i = 0; i < 5; i ++)
    2. printf("%d", arr[0][i]);
    3. printf(" / ");
    4. for (int i = 0; i < 5; i ++)
    5. printf("%d", arr[1][i]);
    6. printf(" = %d\n", n);

    }

    int main(void)
    {

    1. int t = 0;
    2. while (cin >> n && n) {
    3. if (t++) puts("");
    4. ans = 0;
    5. for (int y = 1234; y <= 50000; y++) {
    6. int x = y * n;
    7. get_arr(arr[0], x);
    8. get_arr(arr[1], y);
    9. if (check()) {
    10. ans++;
    11. print();
    12. }
    13. }
    14. if (!ans) printf("There are no solutions for %d.\n", n);
    15. }
    16. return 0;

    }


  • 简单分析一下程序的实现
  1. * **`main`**:
  2. * 输入n,判断输入的n是否准确;
  3. * `if(t++) puts("");`输出一个换行符,在进行每一步操作之后。也就是`t`这个参数变量对于程序的运行效果没有影响, 只是加上之后会更加使得你的程序规范化。
  4. * `y = 1234; y <= 50000; y++`yfghij的数表示,因为知道了fghij之后,由于自己输入的n,所以abcde也就知道了。在算法分析中也体现出来了。
  5. * `get_arr`的介绍:

JackDan9 Thinking
算法竞赛入门经典

发表评论

表情:
评论列表 (有 0 条评论,323人围观)

还没有评论,来说两句吧...

相关阅读

    相关 暴力匹配算法

    tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。 推荐:[体系化学习Java(Java面试专

    相关 暴力破解算法

    暴力破解算法 可用于如下场景: 1、密码猜测 2、对于罗拉模块的数据请求,当发现模块么有回应数据时,往往考虑是否模块所处位置导致信号无法到达,此时可借助其他模块作为中继

    相关 算法暴力求解

    算法之暴力求解 暴力求解的简单解释: 很多问题都可以”暴力解决”——不用太动脑筋,把所有的可能性都列举出来,然后一一实验。尽管

    相关 算法暴力破解法(穷举法)

    一,什么是暴力破解法? 暴力破解法,就是把所有条件,相关情况统统考虑进去,让计算机进行检索,指导得出与之所有条件符合的结果 (但是,暴力破解法对计算机资源耗费严重,如果