三级相比二级增加了进制转换、位运算、编码等新考点,需要理解计算机内部的数据表示和运算方式。
计算机基础知识
这部分与一级、二级共有,纯记忆类知识点。三级中计算机基础知识的题量进一步减少,但仍需掌握。
历年真题解析
2024年6月第3题
⼀般默认64位计算机系统中整型变量(int)还是32位,则整数能够表⽰的数据范围是( )。
A. -32768 ~ 32767 B. 0 ~ 65535 C. -2147483648 ~ 2147483647 D. 0 ~ 4294967295
答案:C
解析: 64位系统中int还是32位,范围是-2³¹到2³¹-1,即-2147483648到2147483647。
2024年3月判断题第9题
小杨今年春节回奶奶家了,奶奶家的数字电视要设置ip地址并接入到WIFI盒子才能收看节目,那这个WIFI盒子具有路由器的功能。( )
答案: ✅ 正确
解析: 具有路由功能的WIFI盒子就是路由器,负责给设备分配IP地址并连接互联网。
进制转换
三级核心考点之一!二、八、十、十六进制之间的相互转换是必考题。掌握短除法、位权展开法就能轻松应对。
历年真题解析
2024年12月第1题
下列⼆进制表⽰的⼗进制数值分别是( ) 1 [10000011]原=( ) 2 [10000011]补=( )
A. -125,-3 B. -3, -125 C. -3,-3 D. -125,-125
答案:B
解析: 原码10000011首位1为负,数值3,原码=-3。补码=反码+1=11111100+1=11111101=-125。
2024年6月第12题
已知字符 '0' 的ASCII编码的⼗进制表⽰为48,则执⾏下⾯C++代码后,输出是( )。
#include<iostream>
usingnamespacestd;
intmain(){
string s = "0629";
int n = s.length();
int x = 0;
for(int i = 0; i < n; i++)
x += s[i];
cout << x << endl;
return0;
}
A. 17 B. 158 C. 209 D. 316
答案:C
解析: s=“0629”,‘0’=48,‘6’=54,‘2’=50,‘9’=57。48+54+50+57=209。
2024年9月第3题
8进制数3703转换成16进制数是()
A. 7C3 B. 7A3 C. 7B3 D. 7D3
答案:A
解析: 8进制3703先转10进制:38³+78²+0*8+3=1987。再转16进制:1987/16=124余3,124/16=7余12(C),7/16=0余7,得7C3。
2025年3月第1题
Base64 编码将每3字节的输⼊数据编码为 4 字节的输出数据。如果输⼊数据长度不是 3 的倍数,会⽤=号填 充。在Base64编码中,如果输⼊字符串的长度为10字节,编码后的字符串长度是多少( )
A. 12 字节 B. 13 字节 C. 14 字节 D. 16 字节
答案:D
解析: 10字节,每3字节编4字节。10/3=3组余1。3*4=12,余1补两个=号占4,共16字节。
原码、反码、补码
三级最难的知识点之一。理解负数的二进制表示,特别是补码的计算方式。记住:正数的原反补相同,负数用补码表示。
历年真题解析
(NEW)2025年3月第1题
Base64 编码将每3字节的输⼊数据编码为 4 字节的输出数据。如果输⼊数据长度不是 3 的倍数,会⽤=号填 充。在Base64编码中,如果输⼊字符串的长度为10字节,编码后的字符串长度是多少( )
A. 12 字节 B. 13 字节 C. 14 字节 D. 16 字节
答案:D
解析: 10字节,每3字节编4字节。10/3=3组余1。3*4=12,余1补两个=号占4,共16字节。
2024年12月第2题
关于计算机中的编码,下列说法中错误的是()
A. 对于⽆符号数,原码就是真值 B. 正数的反码是其本⾝ C. 负数的反码和补码是不⼀样的 D. 负数的反码,在其原码的基础上, 各个位取反
答案:D
解析: A正确,无符号数原码=真值。B正确,正数反码是本身。C正确,负数反码和补码不一样。D错误,符号位不变其余取反,不是所有位取反。
2024年3月第1题
整数-5的16位补码表⽰是( )。
A. 1005 B. 1006 C. FFFA D. FFFB
答案:D
解析: 5的二进制=0000 0000 0000 0101,取反=1111 1111 1111 1010,加1=1111 1111 1111 1011=FFFB。
2025年3月第3题
在 8 位⼆进制原码表⽰中,⼋进制数 -5 的⼆进制形式是什么( )
A. 10000101 B. 11111010 C. 11111011 D. 00000101
答案:A
解析: 8位原码:符号位1表示负数,数值5=101,-5原码=1000 0101。
2026年3月第5题
8 位⼆进制下,⼗进制数-15 的补码是( )。
A. 11110000 B. 10001111 C. 10010000 D. 11110001
答案:D
解析: 15的二进制0000 1111,取反1111 0000,加1得1111 0001。
历年原码反码补码判断题
2024年12月第6题
补码1111 1101进行运算1111 1101>>1以后得到的结果是()
A. 1111 1100 B. -2 C. 1111 1101 D. 1111 1010
答案:B
解析: 1111 1101是负数-3,算术右移1位符号位补1,得1111 1110=-2。
2024年3月判断题第1题
任意整数a的二进制反码与补码都有1位不同。( )
答案: ❌ 错误
解析: 正数的反码和补码相同(都是本身),没有不同。只有负数反码和补码差1位。
位运算
三级最高频的考点!与(&)、或(|)、异或(^)、取反(~)、左移(<<)、右移(>>)六个运算符必须掌握。
历年真题解析
2024年12月第11题
下列程序最后输出的是()
int a=65;
cout<<tolower(a)<<endl;
A. 65 B. A C. a D. 97
答案:D
解析: tolower()把大写转小写,A的ASCII=65,tolower(65)=97对应a。输出97。
2024年6月第14题
下面可以正确输出 They're planning a party for their friend's birthday. 的C++语句是?
A.
cout << 'They\'re planning a party for their friend'\'s birthday." << endl;
B.
cout << "They\'re planning a party for their friend's birthday.'<< endl;
C.
cout << 'They're planning a party for their friend's birthday.'<< endl;
D.
cout << "They\'re planning a party for their friend\'s birthday." << endl;
答案:D
解析: D用双引号括起,内部单引号用反斜杠转义,正确。其他选项引号使用错误。
2025年3月第7题
在C++中,以下代码的输出是什么()
int a = -5;
unsignedint b = a;
cout << b;
A. -5 B. 5 C. 4294967291 D. 编译错误
答案:C
解析: int转unsigned,-5补码在32位下=4294967291。
2025年9月第2题
下列C++表达式的结果为 true 的是( )。
A. (5 <= 5) && (7 < 5) B. !(10 > 5) C. (10 != 10) || (5 >= 3) D. (5 == 3) && (4 > 2)
答案:C
解析: A:true&&false=false。B:!true=false。C:false||true=true。D:false&&true=false。选C。
历年位运算判断题
2026年3月第2题
a,b是整型变量,各⾃有互不相同的初始值。下列程序实现了什么效果( )。 1 a=a^b; 2 b=a^b; 3 a=a^b;
A. a,b 的值从始⾄终都没有改变。 B. a,b 的值实现了互换。 C. a,b 的值互换了以后,⼜还回去了,相当于没有变化。 D. a,b 的值最后和原值不⼀样,没有任何意义。
答案:B
解析: a=a^b;b=a^b;a=a^b是经典的异或交换两个变量值。
2024年3月判断题第4题
一个int类型变量a,执行操作(a<<2>>2)后的值一定是a。( )
答案: ❌ 错误
解析: 对有符号int,左移再右移可能改变符号位,结果不一定等于原值。对于负数,左移可能溢出导致结果变化。
编码
ASCII码、Base64编码等是三级常考内容。记住常用字符的ASCII值:'0'=48,'A'=65,'a'=97。
历年真题解析
2024年12月第10题
下列程序中,假设一个字符占用的内存空间是1,下列程序中,ch占用的内存空间是( )
char ch[] = "hello world";
size_t ret=strlen(ch);
cout<<ret<<endl;
A. 11 B. 10 C. 13 D. 12
答案:D
解析: char ch[] = "hello world",字符串有11个字符加结束符\0,数组共12个元素。sizeof(ch)=12。strlen(ch)=11只是字符长度,不计\0。所以ch占12字节。
2024年3月第10题
C++的字符变量的码值是整数,下⾯字⾯量形式的字符码值最⼤的是( )。
A. 100 B. 075 C. 0x70 D. 0x60
答案:C
解析: 各选项换算成十进制: A.100就是100;B.075是八进制=78+5=61;C.0x70是十六进制=716=112;D.0x60是十六进制=6*16=96。0x70=112最大,选C。
2024年6月第9题
如果字符串定义为char str[] = "GESP";,则字符数组str的长度为( )。
A. 0 B. 4 C. 5 D. 6
答案:C
解析: char str[] = "GESP",字符串有4个字符加结束符\0,数组长度为5。注意数组长度和字符串长度strlen("GESP")=4的区别。
历年编码判断题
2024年6月判断题第4题
字符常量backslash0常用来表示字符串结束,和字符常量0相同。( )答案: ❌ 错误解析: backslash0是空字符(ASCII码0),0是数字零(ASCII码48),完全不同。
一维数组
数组的基本操作,包括定义、初始化、遍历、下标访问。注意数组下标从0开始。
历年真题解析
2024年3月第11题
下⾯C++程序执⾏的结果是( )。
intmain()
{
int a[20],i;
int cnt=0;
for(i = 0; i < 20; i++)
a[i] = i+1;
for( ; i > 1; i--)
if((a[i-1]+a[i-2])%3)
cnt++;
cout << cnt << endl;
cout << endl;
return0;
}
A. 5 B. 6 C. 10 D. 12
答案:D
解析: i从0到19,i为偶数时输出a[i]=i+1,即1,3,5...19,共10个奇数。
2025年12月第2题
以下关于标准 C++ ⼀维数组的描述,哪⼀项是错误的?( )
A. 数组的下标从0开始 B. 数组在内存中是连续存放的 C. 数组的长度只能在运⾏时才能确定 D. 可以在程序中修改数组某个元素的值
答案:C
解析: 数组下标从0开始,这是C++基本规则。
2025年3月第12题
以下代码的功能是将数组中的奇数和偶数分别放在数组的前半部分和后半部分,横线处应该填⼊的是()
#include<iostream>
usingnamespacestd;
intmain(){
int arr[] = {1, 2, 3, 4, 5};
int left = 0, right = 4;
while (left < right) {
while (arr[left] % 2 == 1 && left < right) left++;
————————————————————————————————————————————————————
if (left < right) {
swap(arr[left], arr[right]);
}
}
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
return0;
}
A. while (arr[left] % 2 == 0 && left < right) right--; B. while (arr[right] % 2 == 0 && left < right) left--; C. while (arr[right] % 2 != 0 && left < right) right--; D. while (arr[right] % 2 == 0 && left < right) right--;
答案:D
解析: 题目要求将数组中的奇数放前半部分、偶数放后半部分。left从左向右跳过奇数,right从右向左跳过偶数,找到一对后交换。横线处应填入:while (arr[right] % 2 == 0 && left < right) right--。
历年一维数组判断题
2024年6月判断题第5题
数组的所有元素在内存中可以不连续存放。( )答案: ❌ 错误解析: 数组在内存中是连续存放的,这是数组的基本特征。
2026年3月判断题第1题
定义 int arr[5] = {1,2,3};,则 arr[3] 的值为 0,arr[5] 是合法下标。( )答案: ❌ 错误解析: arr[3]未初始化但静态数组默认0,正确。但arr[5]下标越界,数组只有0~4。
字符串
C++ string类型和字符数组的基本操作,包括长度、遍历、ASCII码转换。
历年真题解析
2024年3月第8题
在下列代码的横线处填写( ),可以使得输出是GESP IS INTERESTING。
intmain()
{
string str="gEsP is Interesting";
int x = str.length();
for(int i = 0; i < x; i++)
if ((str[i]>='a') && (str[i]<='z'))
________________________;
cout << str << endl;
cout << endl;
return0;
}
A. str[i]+='a'-'A' B. str[i]+=20 C. str[i]+='A'-'a' D. ⽆法实现
答案:C
解析: 题目要求将小写字母转为大写。小写字母转ASCII码减32,即加上chr(65)-chr(97)。A选项加32是大写转小写,C选项减32才是小写转大写,正确。
2024年6月第10题
在下列代码的横线处填写( ),可以使得输出是“7”。
#include<iostream>
usingnamespacestd;
intmain(){
intarray[5] = {3,7,5,2,4};
int max = 0;
for(int i=0; i<5; i++)
if(______________) // 在此处填入代码
max = array[i];
cout << max << endl;
return0;
}
A. max > array[i] B. max < array[i] C. max = array[i] D. 以上均不对
答案:B
解析: 题目要求找数组中的最大值。max初始为0,遍历数组,如果当前元素比max大就更新。数组{3,7,5,2,4}中最大值是7,横线处应填max < array[i]。A是找最小值,C是赋值。
历年字符串判断题
2025年9月第14题
以下C++代码中存在⼏处错误( )。
#include<iostream>
```cpp
usingnamespacestd;
intmain(){
constint SIZE = 5;
int arr[SIZE];
for (int i = 0; i <= SIZE; i++) {
arr[i] = i * 2;
}
cout << arr[SIZE] << endl;
return0;
}
A. 0处 B. 1处 C. 2处 D. 3处
答案:C
解析: 两处错误:i<=SIZE越界和cout<<arr[SIZE]访问越界。共2处。
2025年12月判断题第3题
strcmp(str1, str2) 返回 0 表示 str1 大于 str2,返回正数表示两者相等。( )答案: ❌ 错误解析: strcmp返回0表示相等,正数表示str1大于str2。
函数
函数的定义、调用、参数传递、返回值。注意全局变量和局部变量的作用域。
历年真题解析
2025年12月第14题
以下关于 C++ 中 abs() 函数的描述,正确的是( )
A. abs() 函数可⽤于计算 int 类型整数的绝对值,头⽂件为
答案:A
解析: abs()计算整数绝对值,头文件
2025年12月第7题
以下关于 C++ 求最⼩值函数 min() 的描述,不正确的是( )
A. 函数必须返回⼀个值 B. 该函数可以嵌套调⽤ C. 调⽤ min(5) 是错误的,不能通过编译 D. 调⽤ min()(不传任何参数)可以通过编译,结果为 0
答案:D
解析: min()需要两个参数,不传参无法通过编译。D不正确。
2025年9月第13题
以下关于C++函数的说法,正确的是( )。
A. 函数参数传递只有值传递⼀种⽅式。 B. 函数的形参在函数调⽤结束后依然占⽤内存空间 C. 没有返回值的函数必须声明为 void 类型,且不能包含 return 语句 D. C++11 及之后标准要求函数必须显式声明返回类型,不允许默认返回 int
答案:D
解析: A错误有引用传递。B错误形参调用后释放。C错误void函数可无return。D正确。
历年函数判断题
2025年9月判断题第5题
对于 enum Color { RED, GREEN, BLUE };,RED 的类型是 int。( )答案: ✅ 正确解析: C++中枚举类型的枚举值默认是int类型。
枚举与综合
综合运用循环、条件判断和逻辑思维解决实际问题,通常需要写出代码或分析代码输出。
历年真题解析
2024年12月第13题
兔⼦五元⼀只,鸡三元⼀只,⼩鸭⼦⼀元三只,现在你有⼀百元要买⼀百只,兔⼦、鸡、鸭⼦,问兔⼦、
鸡、鸭⼦各买多少只,每种必须⾄少⼀只,下列哪个程序能实现。( )。
A.
for(int i = 0; i <= 100; i++){
for(int j = 0; j <= 100; j++){
for(int k = 0; k <= 100; k++){
if(i + j + k == 100 && 25 * i + 10 * j + k == 300)
cout << i << " " << j << " " << k << endl;
}
}
}
B.
for(int i = 0; i <= 100; i++){
for(int j = 0; j <= 100; j++){
for(int k = 0; k <= 100; k++){
if(i + j + k == 100 && 20 * i + 10 * j + k == 300)
cout << i << " " << j << " " << k << endl;
}
}
}
C.
for(int i = 0; i <= 20; i++){
for(int j = 0; j <= 34; j++){
for(int k = 0; k <= 20; k++){
if(i + j + k == 100 && 15 * i + 9 * j + k == 300)
cout << i << " " << j << " " << k << endl;
}
}
}
D.
for(int i = 0; i <= 100; i++){
for(int j = 0; j <= 100; j++){
for(int k = 0; k <= 100; k++){
if(i + j + k == 100 && 15 * i + 9 * j + k == 300)
cout << i << " " << j << " " << k << endl;
}
}
}
答案:D
解析: 兔子5元鸡3元鸭1元3只。100元100只:i+j+k=100,5i+3j+k/3=100 => 15i+9j+k=300。D正确。
2024年6月第1题
⼩杨⽗母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语⾔有( )种。
A. 1 B. 2 C. 3 D. 4
答案:C
解析: GESP一级可选C++、Python、C三种语言。
2024年9月第11题
陈A歹种植一批农作物,第一天需要浇水一次,随后的两天(第2、第3天),每天需要浇水2次,再随后的 3天(第4、第5、第6天),需要每天浇水3次,这样持续下去,随后的n天,每天需要浇水n次。请问在100天里,总 共浇了多少次水( )
A. 994 B. 996 C. 995 D. 945
答案:D
解析: 第1天1,第2-3天各2(共4),第4-6天各3(共9)...前13组平方和=819,加第14组前9天=126,共945。
2025年12月第13题
以下代码运行后,sum 的结果是( )
int arr[5] = {2, 4, 6, 8, 10};
int sum = 0;
for (int i = 0; i < 5; i++) {
switch (arr[i] % (1|2)) {
case0: sum += 1; break;
case1: sum += 2; break;
case2: sum += 3; break;
}
}
A. 10 C. 14 D. 15
答案:B
解析: 1|2=3。arr[i]%3:2%3=2=>+3,4%3=1=>+2,6%3=0=>+1,8%3=2=>+3,10%3=1=>+2。sum=11。
历年枚举判断题
2024年3月判断题第3题
下面C++代码可以计算1到100的累加和,采用的是穷举法。( )答案: ❌ 错误解析: 用的是累加法(循环加),不是穷举法。穷举法是枚举所有可能再判断。
2024年3月 · 编程题
第1题:字母求和
题目: 小杨同学发明了一种新型密码,对于每个小写英文字母,该小写字母代表了一个正整数(即该字母在字母顺序中的位置,如a代表1);对于每个大写英文字母,该大写字母代表了一个负整数(即该字母ASCII码的相反数,如A代表-65)。给定一个由大小写字母组成的字符串,请计算出它对应的加密前的整数是多少。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
intmain(){
int n, ans = 0;
string str;
cin >> n >> str;
for (int i = 0; i < n; i++) {
if (str[i] >= 'a' && str[i] <= 'z')
ans += str[i] - 'a' + 1; // 小写字母:位置值
elseif (str[i] >= 'A' && str[i] <= 'Z')
ans -= str[i]; // 大写字母:ASCII码的相反数
}
cout << ans << endl;
return0;
}
解题思路: 遍历字符串,判断每个字符的大小写,小写加位置值,大写减ASCII码值。考点:字符判断、ASCII码运算。
第2题:完全平方数
题目: 小杨同学有一个包含n个非负整数的序列,想知道其中有多少对下标组合(i,j)(i<j),使得a[i]+a[j]是完全平方数。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
int a[1010];
intmain(){
int n, ans = 0;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
int m = a[i] + a[j];
int t = sqrt(m + 1e-7); // 避免浮点精度问题
if (t * t == m)
ans++;
}
}
cout << ans << endl;
return0;
}
解题思路: 嵌套循环枚举所有数对,求和后判断是否为完全平方数。考点:嵌套循环、完全平方数判断。
2024年6月 · 编程题
第1题:移位
题目: 所有大写字母都向后按固定数目偏移,将字母表视作首尾相接的环。输入偏移量n,输出大写字母表移位替换后的结果。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
intmain(){
int n;
cin >> n;
for (int i = 0; i < 26; i++) {
int j = (i + n) % 26; // 计算偏移后的位置
char ch = 'A' + j;
cout << ch;
}
cout << endl;
return0;
}
解题思路: 遍历26个字母,用(i+n)%26计算偏移后位置。考点:模运算、字符转换。
第2题:寻找倍数
题目: 小杨有一个包含n个正整数的序列,想知道是否存在a[i]使得a[i]是序列中所有数的倍数。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
int a[100005];
intmain(){
int t;
cin >> t;
for (int i = 0; i < t; i++) {
int n;
cin >> n;
int x = 0;
for (int j = 1; j <= n; j++) {
cin >> a[j];
x = max(x, a[j]);
}
int fl = 0;
for (int j = 1; j <= n; j++)
if (x % a[j]) fl = 1;
if (fl) cout << "No" << endl;
elsecout << "Yes" << endl;
}
return0;
}
解题思路: 如果某数是所有数的倍数,它必然是序列的最小值。找到最小值检查整除性。考点:倍数判断、数组遍历。
2024年9月 · 编程题
第1题:平衡序列
题目: 小杨有一个包含n个正整数的序列,判断是否存在一个正整数k(1<k<n)使得第1到第k个数的和等于第k+1到第n个数的和。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
int a[10010];
intmain(){
int t;
cin >> t;
for (int i = 0; i < t; i++) {
int n;
cin >> n;
int sum = 0;
for (int j = 1; j <= n; j++) {
cin >> a[j];
sum += a[j];
}
int tot = 0, fl = 0;
for (int j = 1; j < n; j++) {
tot += a[j];
if (tot * 2 == sum) {
fl = 1;
break;
}
}
if (fl) cout << "Yes" << endl;
elsecout << "No" << endl;
}
return0;
}
解题思路: 先求总和,再遍历分割点k,维护左半部分和,判断左半和是否等于总和的一半。考点:前缀和、遍历。
第2题:回文拼接
题目: 小杨有n个仅包含小写字母的字符串,判断每个字符串是否由两个长度至少为2的回文串前后拼接而成。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
intmain(){
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
string s;
cin >> s;
int m = s.length();
int fl = 0;
for (int j = 2; j <= m - 2; j++) {
string s1 = s.substr(0, j), s2 = s.substr(j, m - j);
string t1 = "", t2 = "";
for (int k = s1.length() - 1; k >= 0; k--) t1 += s1[k];
for (int k = s2.length() - 1; k >= 0; k--) t2 += s2[k];
if (t1 == s1 && t2 == s2) { // 前后都是回文
fl = 1;
break;
}
}
if (fl) cout << "Yes" << endl;
elsecout << "No" << endl;
}
return0;
}
解题思路: 遍历分割点,分别判断前后两部分是否为回文串。考点:字符串处理、回文判断。
2024年12月 · 编程题
第1题:数字替换
题目: 小杨有一个包含n个数字的序列,将其中大于k的数字替换为序列最大值,小于k的数字替换为序列最小值。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
int a[100005];
intmain(){
int n, k;
cin >> n >> k;
int max_value = 0, min_value = 1000000000;
for (int i = 1; i <= n; i++) {
cin >> a[i];
max_value = max(max_value, a[i]); // 找最大值
min_value = min(min_value, a[i]); // 找最小值
}
for (int i = 1; i <= n; i++) {
if (a[i] > k) a[i] = max_value; // 大于k替换为最大值
elseif (a[i] < k) a[i] = min_value; // 小于k替换为最小值
}
for (int i = 1; i <= n; i++) {
cout << a[i];
if (i != n) cout << " ";
elsecout << endl;
}
return0;
}
解题思路: 先遍历找最大值和最小值,再遍历判断每个数与k的关系并替换。考点:数组遍历、条件判断。
第2题:打印数字
题目: 小杨为数字0、1、2、3设计了一款表示形式,每个数字占用5x5的网格。给定一个由0、1、2、3组成的数字串,输出对应的表示形式。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
intmain(){
string n;
cin >> n;
for (int row = 0; row < 5; row++) { // 输出5行
string line = "";
for (char digit : n) {
if (digit == '0') {
if (row == 0 || row == 4) line += ".....";
else line += ".***.";
} elseif (digit == '1') {
line += "****.";
} elseif (digit == '2') {
if (row == 0) line += ".....";
elseif (row == 1) line += "****.";
elseif (row == 2) line += ".....";
elseif (row == 3) line += ".****";
else line += ".....";
} elseif (digit == '3') {
if (row == 0) line += ".....";
elseif (row == 1 || row == 2 || row == 3) line += "****.";
else line += ".....";
}
}
cout << line << endl;
}
return0;
}
解题思路: 按行处理,对每个数字根据行号输出对应的5个字符图案。考点:字符串处理、二维图案输出。
2025年3月 · 编程题
第1题:2025
题目: 小A有一个整数x,他想找到最小的正整数i使得(x & i) + (x | i) = 2025。如果不存在,输出-1。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
intmain(){
int x;
cin >> x;
for (int i = 1; i <= 2025; i++) {
if ((x & i) + (x | i) == 2025) { // 按位与+按位或
cout << i << endl;
return0;
}
}
cout << -1 << endl;
return0;
}
解题思路: 枚举1到2025,检查(x&i)+(x|i)是否等于2025。考点:位运算、枚举。
第2题:词频统计
题目: 给定n个单词,忽略大小写,找出其中出现次数最多的单词(保证唯一),输出小写形式。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
int cnt[100005]; // 记录每个单词出现次数
string words[100005]; // 存单词
intmain(){
int n;
cin >> n;
int mx = 0;
string ans;
for (int i = 1; i <= n; i++) {
string s;
cin >> s;
// 转小写,忽略大小写
for (int j = 0; j < s.length(); j++)
if (s[j] >= 'A' && s[j] <= 'Z')
s[j] = s[j] - 'A' + 'a';
// 查找是否已经出现过
int pos = -1;
for (int j = 1; j < i; j++) {
if (words[j] == s) {
pos = j;
break;
}
}
if (pos == -1) { // 新单词
words[i] = s;
cnt[i] = 1;
if (cnt[i] > mx) {
mx = cnt[i];
ans = s;
}
} else { // 已出现
cnt[pos]++;
if (cnt[pos] > mx) {
mx = cnt[pos];
ans = s;
}
}
}
cout << ans << endl;
return0;
}
解题思路: 用数组记录每个单词出现次数,遍历找最大值。考点:字符串处理、数组遍历。
2025年6月 · 编程题
第1题:奇偶校验
题目: 给定n个非负整数,计算它们在二进制下1的个数总和,以及校验码(总和奇数输出1,偶数输出0)。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
intmain(){
int n, v = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
int c;
cin >> c;
for (; c; c >>= 1) {
v += c & 1; // 统计二进制中1的个数
}
}
cout << v << " " << (v % 2) << endl; // 总数和校验码
return0;
}
解题思路: 二进制数位分离统计1的个数。考点:二进制转换、奇偶判断。
第2题:分糖果
题目: 有n位小朋友排成一队等待老师分糖果。第i位小朋友想要至少a[i]颗糖果,并且分给他的糖果数量必须比前一位小朋友多。问至少需要准备多少颗糖果。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
int a[1005];
intmain(){
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
longlong ans = a[1];
for (int i = 2; i <= n; i++) {
if (a[i] <= a[i-1])
a[i] = a[i-1] + 1; // 不够就比前一个多1
ans += a[i];
}
cout << ans << endl;
return0;
}
解题思路: 从左到右,确保每个小朋友分到的糖果比前一个多,不够就补。考点:数组遍历、贪心。
2025年9月 · 编程题
第1题:数组清零
题目: 小A有一个数组,每次操作找最大值(多个取下标最大的)和非零最小值,最大值减最小值。重复直到全为0,求操作次数。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
int a[105];
intmain(){
int n, cnt = 0;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (;;) {
int mx = n;
for (int i = 1; i <= n; i++)
if (a[i] >= a[mx]) mx = i; // 找最大值(下标最大)
if (a[mx] == 0) break; // 全为0结束
int mn = a[mx];
for (int i = 1; i <= n; i++)
if (a[i] > 0) mn = min(mn, a[i]); // 找非零最小值
a[mx] -= mn; // 最大值减最小值
cnt++;
}
cout << cnt << endl;
return0;
}
解题思路: 模拟操作过程。考点:数组遍历、模拟。
第2题:日历制作
题目: 小A想制作2025年每个月的日历。输入月份m,按格式输出该月的日历。第一行输出MON TUE WED THU FRI SAT SUN,接下来输出日期,日期的个位需要和对应星期几的缩写最后一个字母对齐。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
int day[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
intmain(){
int m;
cin >> m;
int w = 1; // 2025年9月1日是星期一
for (int i = 9; i < m; i++) w = (w + day[i]) % 7;
for (int i = m; i < 9; i++) w = (w - day[i] % 7 + 7) % 7;
if (w == 0) w = 7;
cout << "MON TUE WED THU FRI SAT SUN" << endl;
for (int i = 1; i < w; i++) cout << " ";
for (int i = 1; i <= day[m]; i++) {
printf("%3d", i);
w = w % 7 + 1;
if (w == 1 || i == day[m]) cout << endl;
elsecout << " ";
}
return0;
}
解题思路: 已知2025年9月1日是星期一,以此为基准推算其他月份1日是星期几,然后按格式输出。考点:日期计算、格式化输出。
2025年12月 · 编程题
第1题:密码强度检测
题目: 设计密码强度检测器。安全密码:至少8位、至少一个大写字母、至少一个数字。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
intmain(){
int T;
cin >> T;
for (int i = 0; i < T; i++) {
string password;
cin >> password;
bool has_upper = false, has_digit = false;
for (size_t j = 0; j < password.length(); ++j) {
if (password[j] >= 'A' && password[j] <= 'Z') has_upper = true;
if (password[j] >= '0' && password[j] <= '9') has_digit = true;
}
if (password.length() >= 8 && has_upper && has_digit)
cout << "Y" << endl;
else
cout << "N" << endl;
}
return0;
}
解题思路: 遍历字符串检查条件。考点:字符串遍历、字符范围判断。
第2题:智慧购物
题目: 小杨去文具店购买M种不同的文具,商店里有N件文具,每件文具有种类编号K和价格P。对于每种文具,他只买最便宜的那一件。请计算买齐M种文具需要多少钱。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
int min_price[100005];
intmain(){
int M, N;
cin >> M >> N;
for (int i = 0; i <= M; i++)
min_price[i] = 1000000000; // 初始化为很大值
for (int i = 0; i < N; i++) {
int K, P;
cin >> K >> P;
if (P < min_price[K])
min_price[K] = P; // 更新最便宜的价格
}
int total_cost = 0;
for (int k = 1; k <= M; k++)
total_cost += min_price[k]; // 累加每种文具最低价
cout << total_cost << endl;
return0;
}
解题思路: 对每种文具维护最低价格,遍历所有文具更新,最后求和。考点:数组、最小值维护。
第1题:二进制回文串
题目: 给定n,计算1到n范围内二进制回文数的数量。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
int a[50];
intmain(){
int n, ans = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
int t = i, pos = 0;
for (; t; t /= 2) {
a[pos++] = t % 2; // 存二进制位
}
bool ok = true;
for (int i = 0; i < pos; i++)
if (a[i] != a[pos - i - 1]) { // 对称位置比较
ok = false;
break;
}
ans += ok;
}
cout << ans << endl;
return0;
}
解题思路: 遍历1到n,转二进制判断回文。考点:进制转换、回文判断。
第2题:凯撒密码
题目: 给定已破解的凯撒密码明文与密文,以及待破解密文,求对应的明文。
参考代码:
#include<bits/stdc++.h>
usingnamespacestd;
intmain(){
string plain, cipher, target;
cin >> plain >> cipher >> target;
int shift = (cipher[0] - plain[0] + 26) % 26; // 计算偏移量
for (int i = 0; i < target.length(); i++) {
char c = target[i] - shift;
if (c < 'A') c += 26; // 超出范围则循环
cout << c;
}
cout << endl;
return0;
}
解题思路: 通过已知对计算偏移量,逆向解密。考点:字符串处理、模运算。
编程题考点总结
三级编程题核心考点:
进制转换:二进制与十进制互转、二进制回文判断
数位分离:t%10取位、t/=10去位
位运算:&按位与、|按位或、^异或、<<左移、>>右移
数组遍历:找最大最小值、前缀和、条件替换
字符串处理:遍历字符、大小写转换、字符范围判断
枚举算法:for循环枚举所有可能,判断条件
祝君好运
夜雨聆风