前言

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

仔细算了一下, 花了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. C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=.答案是6个Firs ...

  2. Hibernate 常见异常

    Hibernate 常见异常net.sf.hibernate.MappingException        当出现net.sf.hibernate.MappingException: Error r ...

  3. 学习练习 java面向对象梯形面积

    package com.hanqi; public class Ladder { double ShangDi; double XiaDi; double Gao; double MianJi; La ...

  4. centos6.5没有eth0, 只有eth1, eth1无法上网

    1. cat  /etc/udev/rules.d/70-persistent-net/rules 2.将ATTR(address)=XXXXXXXX的内容 替换  文件/etc/sysconfig/ ...

  5. JS &#8203; ZERO WIDTH SPACE

    如上编码 ZERO WIDTH SPACE  在各个语言的表达. JS中使用 var b = a.replace(/\u200B/g,''); 来替换,去掉 ZERO WIDTH SPACE . ht ...

  6. ionic cordova plugin simple demo

    要用cordova plugin 的话还是需要设置一下的 1. 下载 ng-cordova.js download the zip file here 2. 在index.html 中引用 (cord ...

  7. sql语句小练习一

    create database aaa go use aaa go create table student(    sno varchar(3), sname varchar(4) not null ...

  8. JMeter笔记3:聚合报告之90%Line参数说明

    看看JMeter 官网是怎么说的? 90% Line - 90% of the samples took no more than this time. The remaining samples a ...

  9. poj1001_Exponentiation

    这题真是超级大模拟.好繁琐,自己写的打数加法,乘法,写的比我大一时候写的要好很多,大一是借助C++里面的string来写的,这把只用了C,浇一次就ac了,挺开心的,不过写了2个小时啊.注意零的处理.大 ...

  10. js 实现获取对象所有键名(key)的方法

    1.for in 循环 并且使用hasOwnProperty 方法 var jsonObject1 = { "name": "xiaoming", " ...