前言

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

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

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

后来想出来,

    开心就好!

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

正文

  第一部分 从代码说开来

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

是否是想要的串

#inclue <stdbool.h>

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

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

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

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

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

//采用递归算法穷举
void
dgaa(char str[],int len,int idx, int *psum, int *pcut)
{
if (len > idx) {
str[idx] = 'a';
dgaa(str, len, idx + , psum, pcut); str[idx] = 'b';
dgaa(str, len, idx + , psum, pcut); str[idx] = 'c';
return dgaa(str, len, idx + , 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), , &sum, &cut) /*
* 这里处理一个问题
* 一个由abc组成的五位字符串,至少包含 一个连续aa的串有多少个.
*
*/
int main(int argc, char* argv[])
{
int sum = , cut = ;
char str[];
DGAA(str, sum, cut); printf("所要找的所有串:%d个, 至少出现一次aa的串有 %d 个!\n",sum, cut); return ;
} // 串检测函数
bool
isaa(char str[], int len)
{
int i = ;
while(++i < len)
if (str[i] == 'a' && str[i - ] == '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 + , psum, pcut); str[idx] = 'b';
dgaa(str, len, idx + , psum, pcut); str[idx] = 'c';
return dgaa(str, len, idx + , 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哈哈~

C 解决百度知道的一个高中题的更多相关文章

  1. [转]解决百度统计 gzdecode(): insufficient memory

    百度统计API gzdecode($preLogin->retData, strlen($preLogin->retData)) 这段代码会造成一个PHP警告内存不足,解决办法只要换个解压 ...

  2. PHP解决多进程同时读写一个…

    原文地址:PHP解决多进程同时读写一个文件的问题作者:陌上花开 首先PHP是支持进程的而不支持多线程(这个先搞清楚了),如果是对于文件操作,其实你只需要给文件加锁就能解决,不需要其它操作,PHP的fl ...

  3. 解决ul里最后一个li的margin问题

    在html+css布局里ul>li挺常用的,在群里(WEB前端开发 458732443)总有新手问怎么解决li的最后一个margin值的问题.下面介绍一下,大神请不要拍砖. 先看两个demo,你 ...

  4. 完美快速解决百度分享不支持HTTPS的问题

    百度分享不支持HTTPS这件事由来已久,我之前向百度分享提交过这个问题,无果!但近期themebetter主题用户咨询的比较多,我们就总结了解决方案. 第一步:下载百度分享必备文件 点此下载stati ...

  5. ssh框架从页面传中文发生乱码时怎么解决,就是添加一个字符编码拦截器。用springframework自带的便可

    ssh框架从页面传中文发生乱码时怎么解决,就是添加一个字符编码拦截器.用springframework自带的便可

  6. 解决百度Ueditor编辑器表格不显示边框问题

    一.主要内容 CMS使用百度Ueditor编辑器中的表格功能,在编辑模式下可以正常显示边框,而文章发布之后表格不能显示边框.本博文经过查阅相关资料,最终解决了该问题. 二.使用平台 1. dedecm ...

  7. 解决百度BMR的spark集群开启slaves结点的问题

    前言 最近一直忙于和小伙伴倒腾着关于人工智能的比赛,一直都没有时间停下来更新更新我的博客.不过在这一个过程中,遇到了一些问题,我还是记录了下来,等到现在比较空闲了,于是一一整理出来写成博客.希望对于大 ...

  8. 使用fabric解决百度BMR的spark集群各节点的部署问题

    前言 和小伙伴的一起参加的人工智能比赛进入了决赛之后的一段时间里面,一直在构思将数据预处理过程和深度学习这个阶段合并起来.然而在合并这两部分代码的时候,遇到了一些问题,为此还特意写了脚本文件进行处理. ...

  9. 完美解决百度网盘、浏览器下载限速问题proxyee-down(附带win破解版云盘)

    win版破解云盘 下载: <PanDownload> 使用文档: <PanDownload使用> Mac方法 限速.限速! 平时下载东西限速倒无所谓,遇到急一点的.盯着80km ...

随机推荐

  1. 初探appium之元素定位(1)

    无论是selenium还是appium,元素定位都是我们开始实现自动化面临的第一个问题.selenium还好,我们可以在浏览器的调试页面进行元素定位还是蛮方便的.那么appium怎么做呢? 我看到很多 ...

  2. docker-tomcat-nginx 反向代理和负载均衡

    1.部署tomcat镜像 下载官方的tomcat镜像. -jre7 启动docker容器,2个实例,分别映射不同的端口号, ~/work/sample-webapps/[v1.0|v2.0]/下面存放 ...

  3. nginx 配置高并发

    一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1.  worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu ...

  4. linux查看内存和回收内存

    清理前内存使用情况 free -m free -g echo 1 > /proc/sys/vm/drop_caches 清理后内存使用情况 free -m

  5. 图的最短路算法 Bellman-Ford

    BF求图的最短路径的时间复杂度是O(MN),这样的时间复杂度并不比迪杰斯特拉算法好,但是BF算法支持图中存在负权的情况,但图中不能存在负圈,因为如果存在负圈,最短路是不存在的,因此BF算法的另一个重要 ...

  6. 学习记录 java随机数的产生机制

    java 随机数 一.在j2se里我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以把他乘以一定的数,比如说乘以100,他就是个100 ...

  7. [前端 2]常用的JQuery和Dom页面取值与赋值

    导读:书到用时方恨少,需要基础知识的时候,才悔恨自己没有总结学习好.前段时间调了好长时间的页面,突然发现自己之前不怎么在意的取值和赋值,真的是自己一个很薄弱的地方,有时候查半天都找不到一个对的,现在用 ...

  8. Duilib学习笔记《07》— 资源加载

    Duilib的界面表现力能如此丰富,很大程度上得益于贴图描述的简单强大.通过之前的学习及参看相关例子,我们可以发现,在XML布局文件中,不管是窗体背景还是控件,都添加了对应的图片资源以此来美化界面.而 ...

  9. git gc

    git gc 有时候当你运行一些git命令(比如git pull)的时候,会有如下提示: 1 2 Auto packing the repository for optimum performance ...

  10. XML处理

    //生成XML XmlDocument xmlDoc = new XmlDocument(); XmlElement root = xmlDoc.CreateElement("Data&qu ...