2020蓝桥杯校内模拟赛1-5(详细版本,看完就会)

1.题目:
问题描述  在计算机存储中,15.125GB是多少MB?
答案提交  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数。

  • 学习计算机的人都知道1GB=1024MB(2的10次方)
    所以这道题的答案即为15.125*1024=15488(可以使用电脑的计算器,也可以手算)

2.题目:
问题描述
1200000有多少个约数(只计算正约数),填一个整数。


  • 问题分析
    枚举法
    约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。
    4的正约数有:1、2、4。
    6的正约数有:1、2、3、6。
    10的正约数有:1、2、5、10。
    12的正约数有:1、2、3、4、6、12。
    20的正约数有:1、2、4、5、10、20。
    注意:一个数的约数必然包括1及其本身。
  • 代码:
#include
#define N 1200000
using namespace std;

int main(){
	int ans=0;
	for(int i=1;i<N;++i){
		if(N%i==0)
		ans++;
	}
	cout<<ans<<endl;
	return 0;
}

答案:96
3.题目:二叉树
【问题描述】
一棵包含有2019个结点的二叉树,最多包含多少个叶结点?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数。


  • 分析思路
    下图就是一颗二叉树2020蓝桥杯校内模拟赛1-5(详细版本,看完就会)_第1张图片
    二叉树有几个性质:
    (1)叶节点即为度为0的节点,没有左右子节点,上图中最后一行和第三行最后一个都是叶节点
    (2)n=n0+n1+n2,为使叶子节点数(n0)最多,必须n1最小,则n1为0,而n0=n2+1
  • 解法一:
    得n2=(2019-1)/2=1009
    所以n0=1010
  • 解法二:
    题目给的节点数是2019个,我们考虑满二叉树的节点数,
    当这个树为10层时,其节点数为2^10(1024个节点);
    当这个数为11层时,其节点数为2^11(2048个节点)
    所以由2019得知这棵树为11层,且最后一层(第11层)没有满。
    用题目给的2019节点数减去第十层节点数,得出11层的叶子节点数
    2019-1024=995
    可得出11层由995个叶子结点,512-995/2=15
    所以总得叶子节点数为995+15=1010

答案:1010
4.题目:
题目描述
在1至2019中,有多少个数的数位中包含数字9?
注意,有的数中的数位中包含多个9,这个数只算一次。例如,1999这个数包含数字9,在计算时只是算一个数。
结果为1个整数


  • 分析思路:
    用取余数的方法,并且检查
#include
#include
#include
using namespace std;
const int N=2019;

int ans=0;
void check(int x){
	while(x)  //x为1-2019间的数 
	{
		int y=x%10; //对其求余数 
		if(y==9){  //余数为9,说明该数字有9 
			ans++;
			return;
		}
		x=x/10;  //排除重复 
	}
	return;
}
int main(){
	for(int i=1;i<=N;i++){
		check(i);
	}
	cout<<ans<<endl;
	return 0;
	}
 

答案:544
在这里插入图片描述
5.题目:
一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。
给定正整数 n,请问在整数 1 至 n 中有多少个数位递增的数?
【输入格式】
输入的第一行包含一个整数 n。
【输出格式】
输出一行包含一个整数,表示答案。
【样例输入】
30
【样例输出】
26
【评测用例规模与约定】
对于 40% 的评测用例,1 <= n <= 1000。
对于 80% 的评测用例,1 <= n <= 100000。
对于所有评测用例,1 <= n <= 1000000。


  • 分析思路
    深度优先搜索
#include
using namespace std;

int n;
int sum = 0;

void dfs(int num)//定义一个函数 
{
 for(int i = num%10 ? num%10 : 1; i <= 9; i++){  //数字对10取余 ,例如3%10=3,不符合,继续循环 
 if(num*10+i <= n){
 sum++;
 dfs(num*10+i);
 }
 }
}

int main()
{
cin>>n;
 dfs(0);
 cout<<sum<<endl;
 return 0;
}

在这里插入图片描述

你可能感兴趣的:(c++,蓝桥杯习题)