【蓝桥杯】枚举与单位换算

今天是【蓝桥杯】枚举与单位换算的8个练习题。题目不少,须沉下心学习。

一、ASC

ASC12
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
已知大写字母 A 的 ASCII 码为 65,请问大写字母 L 的 ASCII 码是多少?

#include <iostream>
using namespace std;
int main()
{
  cout<< 'L'-'A'+65;
  return 0;
}

二、空间

空间13
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝准备用 256MB 的内存空间开一个数组,数组的每个元素都是 32 位 二进制整数,如果不考虑程序占用的空间和维护内存需要的辅助空间,请问 256MB 的空间可以存储多少个 32 位二进制整数?

注意:如果写成256* 1027* 1024*8/32,默认存int ,会爆。尽量将除号往前写。
1KB = 1024B, 1MB = 1024KB

#include <iostream>
using namespace std;
int main()
{
  cout<< 256/32*1024*1024*8;
  return 0;
}

三、约数个数

约数个数14
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
1200000 有多少个约数(只计算正约数)。

约数:又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。

#include<iostream>
#include<cstdio>
using namespace std;
#define n 1200000  //define的格式记清楚了,别混

int main(void)
{
	int res = 0;
	for(int i = 1; i <= n/2; i++)
	{
		if(n%i == 0)
			res++;
	}
	cout<< res+1 << endl;
	return 0;
}

四、单词分析

单词分析15
题目描述
小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。
现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这个字母出现的次数。
输入描述
输入一行包含一个单词,单词只由小写英文字母组成。
对于所有的评测用例,输入的单词长度不超过 1000。
输出描述
输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪个。如果有多个字母出现的次数相等,输出字典序最小的那个。
第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。

字符在计算机中是按字符的ascii值存储的,实际上就是个整数.。
字符和数字相加结果为数字,可以整体加( )强转为char

#include<iostream>
#include<cstring>
using namespace std;
int cnt[27];

int main(void)
{
	string s;
	cin>> s;
	
	int len = s.size();
	for(int i = 0; i < len; i++)
		cnt[s[i] - 'a']++;
		
	int max = 0,idx = 0;
	for(int j = 0; j <26; j++)
	{
		if(cnt[j] > max)  
			max = cnt[j],idx = j;
	}
	cout<< char(idx+'a') << endl << max;
	return 0;
}

或者,可以按照下面这种写法。

#include<iostream>
#include<cstring>
using namespace std;
int cnt[27];

int main(void)
{
	string s;
	cin>> s;
	
	int len = s.size();
	for(int i = 0; i < len; i++)
		cnt[s[i] - 'a']++;
		
	int max = 0;
	char idx;
	for(int j = 0; j <26; j++)
	{
		if(cnt[j] > max)  
			max = cnt[j],idx = j+'a';
	}

	cout<< idx << endl << max;
	return 0;
}

五、既约分数

既约分数16
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。
例如3/4,1/8,7/1都是既约分数。
请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1 和 2020)?

写一个最大公约数函数。
gcd(a,b) == gcd(b,a%b)。递归终止条件:gcd(a,0) = a;
附:最大公约数__gcd(a,b);
最小公约数__lcm(a,b);
这两个在竞赛中禁止使用。

#include<iostream>
#include<cstring>
using namespace std;

typedef long long LL;

int gcd(int a,int b)
{
	if(b == 0)  return a;
	else return gcd(b,a%b);
}

int main(void)
{
	int cnt = 0;
	for(int i = 1; i <= 2020; i++)
	{
		for(int j = 1; j <= 2020; j++)
		{
			if( gcd(i,j) == 1)
				cnt++;
		}
	}
	cout<< cnt << endl;
	return 0;
}
//最大公约数
int gcd(int a,int b) 
{
	if(b == 0)  return a;
	else return gcd(b,a%b);
}
//最小公约数
int lcm(int a,int b)
{
	return a*b/gcd(a,b);
}

六、时间显示

时间显示17
题目描述
小蓝要和朋友合作开发一个时间显示的网站。
在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从1970 年 11 月 11 日 00:00:00 到当前时刻经过的毫秒数。
现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时分秒输出。
输入描述
输入一行包含一个整数,表示时间。
输出描述
输出时分秒表示的当前时间,格式形如 HH:MM:SS,其中 HH 表示时,值为 0​​​​ 到 23​​​​,M 表示分,值为 0​​​​ 到 59,S 表示秒,值为 0​​ 到 59​。时、分、秒 不足两位时补前导 0。

#include<iostream>
#include<cstring>
using namespace std;

typedef long long LL;

int main(void)
{
	LL n;
	cin>> n;
	
	n /= 1000;
	
	int h = n/3600;
	int min = (n-h*3600) /60;
	h %= 24;
	min %= 60;
	
	int sec = n%3600;
	sec %= 60;

	printf("%02d:%02d:%02d",h,min,sec);
	return 0;
}

七、特殊时间

特殊时间18
问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
2022 年 2 月 22 日 22:20 是一个很有意义的时间, 年份为 2022 , 由 3 个 2 和 1 个 0 组成, 如果将月和日写成 4 位, 为 0222 , 也是由 3 个 2 和 1 个 0 组成, 如果将时间中的时和分写成 4 位, 还是由 3 个 2 和 1 个 0 组成。

小蓝对这样的时间很感兴趣, 他还找到了其它类似的例子, 比如 111 年 10 月 11 日 01: 11,2202 年 2 月 22 日 22:02 等等。
请问, 总共有多少个时间是这种年份写成 4 位、月日写成 4 位、时间写成 4 位后由 3 个一种数字和 1 个另一种数字组成。注意 1111 年 11 月 11 日 11: 11 不算,因为它里面没有两种数字。
更新中…

八、相乘

相乘19
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小蓝发现,他将 1 至 1000000007 之间的不同的数与 2021 相乘后再求除以 1000000007 的余数,会得到不同的数。 小蓝想知道,能不能在 1 至 1000000007 之间找到一个数,与 2021 相乘后 再除以 1000000007 后的余数为999999999。如果存在,请在答案中提交这个数; 如果不存在,请在答案中提交 0。

枚举1~1000000007。

#include<iostream>
using namespace std;
typedef long long LL;
int main()
{
  for(LL n = 1; n <= 1000000007; n++)
  {
    if(n*2021%1000000007 == 999999999)
    {
      cout<< n;
      return 0;
    }
  }
  cout<< "0";
  return 0;
}

持续更新,欢迎一起学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qing小星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值