蓝桥杯填空题攻克
目录
1.握手问题(条件枚举)
2.门牌制作(十进制整数拆解)
3.九进制转十进制(进制转换)
一.a 进制数转换为十进制数
二.十进制转换为a进制
4.跑步(日期问题)
1.握手问题(条件枚举)
简单的条件枚举
假设前7个人,不互相握手,其他人互相握手
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int ret=0;
for(int i=1;i<=50;i++)
{
for(int j=i+1;j<=50;j++)
{
if(i<=7 && j<=7) continue;
else ret++;
}
}
cout<<ret<<endl;
return 0;
}
2.门牌制作(十进制整数拆解)
所谓十进制整数拆解,就是将一个十进制整数x按照十进制拆解除每一位
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int count=0;
for(int i=1;i<=2020;i++)
{
for(int j=i;j>0;j=j/10)
{
if(j%10==2)
{
count++;
}
}
}
printf("%d",count);
// 请在此输入您的代码
return 0;
}
3.九进制转十进制(进制转换)
一.a 进制数转换为十进制数
计算方式是把每一位上的数字乘以该位的权重,再将所有结果相加,最终得到对应的十进制数。
例如对于一个二进制数101,转换成十进制过程为:
=1×2^2+0×2^1+1×2^0
=4+0+1
=5
二.十进制转换为a进制
例如,将十进制数 13 转换为二进制数(a = 2
)的过程:
- 第 1 步:
13 ÷ 2 = 6...1
,余数为 1。 - 第 2 步:
6 ÷ 2 = 3...0
,余数为 0。 - 第 3 步:
3 ÷ 2 = 1...1
,余数为 1。 - 第 4 步:
1 ÷ 2 = 0...1
,余数为 1。
将余数从下往上排列结果为1101,因为取余顺序与结果相反,所以使用队列的先进先出,每次取余将结果压入队列
#include<bits/stdc++.h>
using namespace std;
//将 a 进制数 num 转换为十进制数
int convertother(int a, int num)
{
int b = 0;
int ret = 0;
int i = 0;
// 当 num 大于 0 时,说明还有位需要处理,继续循环
while(num > 0)
{
// 通过取余运算得到 num 的最低位数字
b = num % 10;
// 将 num 除以 10,去掉已经处理过的最低位
num /= 10;
// 把当前位数字 b 乘以 a 的 i 次幂,累加到结果 ret 中
ret += b * pow(a, i);
i++;
}
return ret;
}
//将十进制数 num 转换为 a 进制数
int convert2other(int a, int num)
{
int b = 0;
// 变量 ret 用于存储最终转换得到的 a 进制结果
int ret = 0;
// 变量 i 作为指数,用于表示当前位对应的 10 的幂次
int i = 0;
queue<int> mod;
// 当 num 大于 0 时,继续进行除 a 取余操作
while(num > 0)
{
// 计算 num 除以 a 的余数
b = num % a;
// 将 num 除以 a 并取整
num /= a;
// 把余数 b 压入队列 mod 中
mod.push(b);
}
while(!mod.empty)
{
// 取出队列的队首元素
b = mod.front();
// 把队首元素乘以 10 的 i 次幂,累加到结果 ret 中
ret += b * pow(10, i);
// 指数 i 加 1,为处理下一位做准备
i++;
}
return ret;
}
int main()
{
int a = 9;
int num = 2022;
int s = convertother(a, num);
cout << s << endl;
return 0;
}
4.跑步(日期问题)
考点:
- 判断闰年
-
if(y % 4==0 && y % 100!=0 && m==2 || y%400==0 && m==2)
- 日期的遍历,一个日期到另一个日期的遍历
- 星期的判断,如某天是星期几
#include <iostream>
using namespace std;
int ds[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
// 请在此输入您的代码
int sy=2022;
int ey=2022;
int week=6;
int ans=0;
for(int y=sy;y<=ey;++y)//枚举年
{
for(int m=1;m<=12;++m)//枚举月
{
int dd=ds[m];
//判断闰年
if(y % 4==0 && y % 100!=0 && m==2 || y%400==0 && m==2)
dd=29;
for(int d=1;d<=dd;++d)//枚举日
{
if(week==0 || week==6 || d%10==1) ans++;//判断是否满足题目
week=(week+1)%7;//向后推移星期几
}
}
}
cout<<ans<<endl;
return 0;
}
谢谢