每日一题 | day18(统计每个月兔子的总数|字符串通配)
Posted WhiteShirtI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题 | day18(统计每个月兔子的总数|字符串通配)相关的知识,希望对你有一定的参考价值。
选择题
1、使用printf函数打印一个double类型的数据,要求:输出为10进制,输出左对齐30个字符,4位精度。以 下哪个选项是正确的?
A %-30.4e
B %4.30e
C %-30.4f
D %-4.30f
正确答案 C:%m.n中,m为正数时表示向右对齐,输出m位,不够用空格在前面补上;当m为负数时,表示向左对齐位。如果输出的类型为%f,则n表示精确到小数点后n位,不够后面补0,表示小数点后面共有n位;如果类型为%d,则m表示要输出的位数,小于数据长度则前面补空格,如果是0m则表示不够位数前面补0
2、malloc函数进行内存分配是在什么阶段?
A 编译阶段
B 链接阶段
C 装载阶段
D 执行阶段
正确答案 D:略
编程题
题目1:
题解思路:用first、second、third分别表示1、2、3月份的兔子数量。第一个月是first=1、second=0、third=0。所以要从第二个月开始算,第一个月的兔子应该为second+third,其中这里的second表示的是兔子开始进入第三个月,开始生兔子,third表示已经生过的兔子,每个月还要继续生。second应该为第一个月的兔子的数量,third应该为第二个月兔子的数量和原本兔子的数量。最后返回每个月的兔子的总和
代码:
#include <iostream>
#include <vector>
using namespace std;
int totalRabbit(int& month)
{
int first = 1, second = 0, third = 0;
while (--month)
{
third += second;
second = first;
first = third;
}
return first + second + third;
}
int main()
{
int month;
while (cin >> month)
{
cout << totalRabbit(month) << endl;
}
return 0;
}
这道题也可以化为斐波那契数列
#include <iostream>
#include <vector>
using namespace std;
int totalRabbit(int& month)
{
if (month <= 2)
return 1;
int f1 = 1;
int f2 = 1;
int res = 0;
for (int i = 2; i < month; ++i)
{
res = f1 + f2;
f1 = f2;
f2 = res;
}
return res;
}
int main()
{
int month;
while (cin >> month)
{
cout << totalRabbit(month) << endl;
}
return 0;
}
题目2:
解题代码思路:定义通配字符串pattern,查看是否匹配字符串str。比较方式有3种,第一种是字符与字符比较,第二种是字符与?比较,第三种是*与字符比较
这道题我们用递归的方式去比较两个字符串。递归结束条件有3个,第一个是如果两字符同时走到尾表示匹配,返回true;如果存在一个走到尾,一个没走到尾表示不匹配,返回false。如果两个字符串遍历到的相同位置字符不同,则表示不匹配,返回false。当* pattern为 '?‘时表示匹配一个字符,则递归参数为两个指针都向后移动一个位置继续判断。当* pattern为’*'时匹配的情况分为3种,第一种为匹配0个字符串,则递归参数为pattern不变,str向后走一个位置;第二种为匹配1个字符串,则递归参数为pattern向后走一个位置和str向后走一个位置;第三种为匹配多个字符,则递归参数为pattern不变,str向后走一个位置,也就是让str自己走,直到只匹配一个为止。当两个字符相等时表示目前匹配,还需要往后匹配查看是否匹配,递归参数都为向后走一个位置
代码:
#include <iostream>
#include <string>
using namespace std;
bool strMatch(const char* pattern, const char* str)
{
if (*pattern == '\\0' && *str == '\\0') //一起结束表示正确匹配
return true;
if (*pattern == '\\0' || *str == '\\0') //一个字符串先结束则表示不匹配
return false;
if (*pattern == '?') //遇到?,两个字符串都向后移动一个位置
return strMatch(pattern + 1, str + 1);
else if (*pattern == '*')
return strMatch(pattern + 1, str) //匹配0个
|| strMatch(pattern + 1, str + 1) //匹配1个
|| strMatch(pattern, str + 1); //匹配多个
else if (*pattern == *str) //相同一起往后走
return strMatch(pattern + 1, str + 1);
return false; //不同直接返回
}
int main()
{
string pattern, str;
while (cin >> pattern >> str)
{
if (strMatch(pattern.c_str(), str.c_str()))
cout << "true" << endl;
else
cout << "false" << endl;
}
return 0;
}
以上是关于每日一题 | day18(统计每个月兔子的总数|字符串通配)的主要内容,如果未能解决你的问题,请参考以下文章