zoukankan      html  css  js  c++  java
  • C 解决百度知道的一个高中题

    前言

      今天看见一道百度知道上提问,是这样的.

    仔细算了一下, 花了30min.才整出来了,估计现在回去参加高考,数学及格都悬.有时候想做这样的题有什么用,

    学这些东西有什么意义,在这种方面浪费时间有什么值得的.

    后来想出来,

        开心就好!

    想太多,考虑太多心累.我们开心就好.

    正文

      第一部分 从代码说开来

    采用的主要思路是穷举法,穷举完之后,再判断. 思考了一下,主要用 char str[5]; 保存这个这个串. 采用下面函数检测这个串

    是否是想要的串

    #inclue <stdbool.h>
    
    // 串检测函数
    bool 
    isaa(char str[], int len)
    {
        int i = 0;
        while(++i < len)
            if (str[i] == 'a' && str[i - 1] == 'a') 
                return true;
    
        return false;
    }

    效率上也没深入搞了,追求能用就行了.

    那怎么构建这个 char str[5] 呢. 这里原本采用 5层for,这直接pass了,首先一条准则, C程序开发一定要记住,或者程序员也要记住

    1 /*
    2   用不用goto取决你的业务复杂度
    3  
    4  */
    5 
    6 // 但是你一定不要用 超过三层的 循环,那种代码写出来后要打自己脸.

    .后面采用 递归搞了一下, 如下

    //采用递归算法穷举
    void 
    dgaa(char str[],int len,int idx, int *psum, int *pcut)
    {
        if (len > idx) {
            str[idx] = 'a';
            dgaa(str, len, idx + 1, psum, pcut);
    
            str[idx] = 'b';
            dgaa(str, len, idx + 1, psum, pcut);
    
            str[idx] = 'c';
            return dgaa(str, len, idx + 1, psum, pcut);
        }
        ++*psum;
        *pcut += isaa(str, len);
    }

    最后需要 return,因为到这里就结束了,不能再往下了,否则重复计数了. 大家有好方法可以分享.

    到这里一切都准备妥当了. 完整代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    
    // 串检测函数
    bool isaa(char str[], int len);
    
    //采用递归算法穷举
    void dgaa(char str[], int len, int idx, int *psum, int *pcut);
    
    /*
     上面函数的简化宏, 这里 用法是
     int psum = 0, pcut = 0;
     char str[5];
     int cut = DGAA(str);
     */
    #define DGAA(str, sum, cut) 
        dgaa(str, sizeof(str)/sizeof(*str), 0, &sum, &cut)
    
    /*
     * 这里处理一个问题
     *  一个由abc组成的五位字符串,至少包含 一个连续aa的串有多少个.
     *
     */
    int main(int argc, char* argv[])
    {
        int sum = 0, cut = 0;
        char str[5];
        DGAA(str, sum, cut);
    
        printf("所要找的所有串:%d个, 至少出现一次aa的串有 %d 个!
    ",sum, cut);
    
        return 0;
    }
    
    // 串检测函数
    bool 
    isaa(char str[], int len)
    {
        int i = 0;
        while(++i < len)
            if (str[i] == 'a' && str[i - 1] == 'a') 
                return true;
    
        return false;
    }
    
    //采用递归算法穷举
    void
    dgaa(char str[],int len,int idx, int *psum, int *pcut)
    {
        if (len > idx) {
            str[idx] = 'a';
            dgaa(str, len, idx + 1, psum, pcut);
    
            str[idx] = 'b';
            dgaa(str, len, idx + 1, psum, pcut);
    
            str[idx] = 'c';
            return dgaa(str, len, idx + 1, psum, pcut);
        }
        ++*psum;
        *pcut += isaa(str, len);
    }

    我们直接编译链接一下

    gcc -g -Wall -o aa.out aa.c

    总的运行结果如下:

    答案是 至少出现一次aa的串有 79 个.

    第二部分 从更高观点上分析这个问题

      采用思路就是简单的数学集合分析.

    1) . abc 组成 长度为 5的串

        一共有 3^5 = 81 x 3 = 243

    2) . 没有出现过 aa连续的串个数

      A) 串中没有a

        2^5 = 32

      B) 串中只有一个a

        首先剩下4个位置 2^4 = 16 后面 一个a 插入 到    x|x |x |x |x 

        x的位置 有 C(1,5) = 5种,一共有 16 x 5 = 80种

      C) 串中有两个a  x | x | x | x 左边x的位置选出2个 插入 aa

        一共有 2^3 x C(4,2) = 8 x 4 x 3 / 2 = 48种

      D) 串中有3个 a  就是这样情况 a | a | a

        只有 2^2 = 4四种情况

      综上 A,B,C,D 一共有 32 + 80 + 48 + 4 = 112 + 52 = 164种

    综上1) 2) 得到至少一个aa连续出现的5位串 个数为

      243 - 164 = 79 种

    问题已经解决. 欢迎大家给出更巧妙的方法分享.

    后记

       到这里说结束了, 错误是难免的,提出来一定改. 祝今天大家包括自己愉快, 以后的生活多一点行动,少一点

    犹豫,关键是开心就好.O(∩_∩)O哈哈~

  • 相关阅读:
    [原]获取openstack-pike安装包
    [原]Failed connect to mirrors.cloud.aliyuncs.com:80; Connection refused
    [原]shell批量文件增删改前后缀
    [原]CentOS 7 chrony 笔记
    [原]Docker-issue(2) http: server gave HTTP response to HTTPS client
    [原]Docker-issue(1) image name 显示为 <none>
    [原]Django(1)----Django-setting中的STATIC_URL 和STATIC_ROOT 和STATICFILES_DIRS 的区别
    [原]Django-issue(1)---postgresql数据库连接密码错误
    [转]50个极好的bootstrap 后台框架主题下载
    [原]eclipse + pydev :Error in sitecustomize; set PYTHONVERBOSE for tracaeback: KeyError: 'sitecustomize'
  • 原文地址:https://www.cnblogs.com/life2refuel/p/5141429.html
Copyright © 2011-2022 走看看