蓝桥杯刷题笔记
奇怪的捐赠
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int main(){
// 初始化变量num为1000000,代表总金额为100万元
int num = 1000000;
// 初始化变量cnt为0,用于记录最终划分的份数
int cnt = 0;
// 当num不为0时,持续进行循环,此循环的目的是将总金额按七进制拆分
while(num) {
// num % 7 计算出当前num在七进制下的最低位数字
// 这个数字代表了当前7的0次方(即1元)这一份额的数量
// 将其累加到cnt中
cnt += num % 7;
// num /= 7 相当于将num在七进制下右移一位
// 也就是去掉当前七进制表示中的最低位,继续处理更高位
num /= 7;
}
// 输出最终划分的份数
cout << cnt;
return 0;
}
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int main() {
// 初始金额为100万元,单位为元
int money = 1000000;
// 用于记录划分的份数,初始化为0
int cnt = 0;
// 从7的0次方到7的7次方进行遍历,这里k表示7的幂次,从大到小遍历
for(int k = 7; k >= 0; k--) {
// 计算当前7的k次幂能划分出的份数,即总金额除以当前7的幂次方
int numitems = money / pow(7, k);
// 如果划分出的份数大于5份,按照要求最多只能取5份
if(numitems > 5) numitems = 5;
// 将当前划分的份数累加到总份数cnt中
cnt += numitems;
// 从总金额中减去当前划分所使用的金额
money -= numitems * pow(7, k);
// 如果总金额已经为0,说明已经全部分完,跳出循环
if(money == 0) break;
}
// 输出划分的总份数
cout << cnt;
return 0;
}
排序
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
// 自定义比较函数 cmp,用于降序排序
bool cmp(int a, int b) {
return a > b;
}
int main() {
int n;
cin >> n;
// 使用 vector 动态数组存储输入的整数
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
// 升序排序
sort(a.begin(), a.end());
for (int i = 0; i < n; i++) {
cout << a[i];
if (i < n - 1) {
cout << " ";
}
}
cout << "\n";
// 降序排序
sort(a.begin(), a.end(), cmp);
for (int i = 0; i < n; i++) {
cout << a[i];
if (i < n - 1) {
cout << " ";
}
}
return 0;
}
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
// 定义一个常量 maxn,用于数组的最大长度,这里设置为 1e9 + 9
const long long maxn = 5e5+9;
// 定义一个整数数组 a,用于存储输入的整数
long long a[maxn];
// 自定义比较函数 cmp,用于降序排序
bool cmp(long long a, long long b) {
// 如果 a 大于 b,则返回 true,否则返回 false
return a > b;
}
int main() {
// 定义一个整数 n,用于存储输入整数的数量
long long n;
// 从标准输入读取整数 n
cin >> n;
// 循环读取 n 个整数,并存储到数组 a 中
for (long long i = 0; i < n; i++) {
cin >> a[i];
}
// 使用 sort 函数对数组 a 进行升序排序,默认情况下 sort 是升序排序
sort(a, a + n);
// 循环输出升序排序后的数组元素,元素之间用空格分隔
for (long long i = 0; i < n; i++) {
cout << a[i];
if (i < n - 1) {
cout << " ";
}
}
// 输出换行符
cout << "\n";
// 使用 sort 函数和自定义比较函数 cmp 对数组 a 进行降序排序
sort(a, a + n, cmp);
// 循环输出降序排序后的数组元素,元素之间用空格分隔
for (long long i = 0; i < n; i++) {
cout << a[i];
if (i < n - 1) {
cout << " ";
}
}
return 0;
}
1. 单词分析
#include <cstdio>
#include <iostream>
#include <string> // 因为使用了 string 类型,需要包含该头文件
using namespace std;
// 定义一个长度为 26 的整型数组 cnt,用于统计每个小写英文字母出现的次数
// 数组下标 0 到 25 分别对应字母 'a' 到 'z'
int cnt[26];
int main(){
// 定义一个字符串变量 s,用于存储从标准输入读取的字符串
string s;
// 从标准输入读取一个字符串,并将其存储到 s 中
cin >> s;
// 遍历字符串 s 中的每一个字符
for(int i = 0; i < s.size(); i++){
// s[i] - 'a' 可以将字符 s[i] 转换为对应的数组下标
// 例如,若 s[i] 为 'a',则 s[i] - 'a' 为 0;若 s[i] 为 'b',则 s[i] - 'a' 为 1,以此类推
// 然后将对应下标的数组元素值加 1,即统计该字母出现的次数
cnt[s[i] - 'a']++;
}
// 定义一个字符变量 ans1,用于存储出现次数最多的字母
char ans1;
// 定义一个整型变量 ans2,用于存储出现次数最多的字母的出现次数,初始化为 0
int ans2 = 0;
// 遍历数组 cnt,数组长度为 26,代表 26 个小写英文字母
for(int i = 0; i < 26; i++){
// 如果当前字母的出现次数(即 cnt[i])大于之前记录的最大出现次数(即 ans2)
if(cnt[i] > ans2) {
// 更新最大出现次数为当前字母的出现次数
ans2 = cnt[i];
// 将当前字母(通过 i + 'a' 转换为字符形式)赋值给 ans1
ans1 = (i + 'a');
}
}
// 输出出现次数最多的字母
cout << ans1 << "\n";
// 输出出现次数最多的字母的出现次数
cout << ans2;
// 程序正常结束,返回 0
return 0;
}
成绩统计
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
// 定义一个常量 maxn,用于可能的数组大小等场景,这里虽未使用数组,但一般会这样预留
const int maxn = 1e4 + 10;
int main() {
// 定义一个双精度浮点数 n,用于存储输入的学生数量
double n;
// 从标准输入读取学生数量并存储到 n 中
cin >> n;
// 定义一个双精度浮点数 k 并初始化为 n,k 后续会用于计算比例
double k = n;
// 定义一个整型变量 x,用于临时存储每个学生的成绩
int x;
// 定义两个双精度浮点数 good 和 great,分别用于记录成绩大于等于 60 分和大于等于 85 分的学生数量
double good = 0, great = 0;
// 循环 n 次,每次循环处理一个学生的成绩
while (n--) {
// 从标准输入读取一个学生的成绩并存储到 x 中
cin >> x;
// 如果该学生的成绩大于等于 60 分
if (x >= 60) {
// 成绩大于等于 60 分的学生数量加 1
good++;
}
// 如果该学生的成绩大于等于 85 分
if (x >= 85) {
// 成绩大于等于 85 分的学生数量加 1
great++;
}
}
// 计算成绩大于等于 60 分的学生所占的百分比
double ans1 = (double)good / k * 100;
// 计算成绩大于等于 85 分的学生所占的百分比
double ans2 = (double)great / k * 100;
// 以整数形式输出成绩大于等于 60 分的学生所占的百分比,并添加百分号
// 第二个 % 前少了一个点,应该是 %.0f 来表示以整数形式输出
printf("%.0f%%\n%.0f%%", ans1, ans2);
// 程序正常结束,返回 0
return 0;
}