蓝桥杯 练习系统 基础练习(1~13)(C++实现)
整理了练习系统基础练习的前13道题目的代码(每道题的方法肯定不止一种,先暂且这样,以后补)
目录
- *BASIC-1 闰年判断(条件判断)*
- *BASIC-2 01字串(循环)*
- *BASIC-3 字母图形(循环 字符串)*
- *BASIC-4 数列特征(循环 最大值 最小值 累加)*
- *BASIC-5 查找整数(循环 判断)*
- *BASIC-6 杨辉三角形(基础练习 二维数组)*
- *BASIC-7 特殊的数字(循环 判断 数位)*
- *BASIC-8 回文数(循环 判断 回文数)*
- *BASIC-9 特殊回文数(回文数 循环 条件语句)*
- *BASIC-10 十进制转十六进制(循环 整除 求余 判断)*
- *BASIC-11 十六进制转十进制(进制转换 字符处理 判断)*
- *BASIC-12 十六进制转八进制(进制转换 字符 循环)*
- *BASIC-13 数列排序(数组 排序)*
BASIC-1 闰年判断(条件判断)
问题描述
给定一个年份,判断这一年是不是闰年
当以下情况之一满足时,这一年是闰年
- 年份是4的倍数而不是100的倍数
- 年份是400的倍数
其他的年份都不是闰年
输入格式
输入包含一个整数y,表示当前的年份
输出格式
输出一行,如果给定的年份是闰年,则输出yes,否则输出no
样例输入
2013
样例输出
no
样例输入
2016
样例输出
yes
数据规模与约定
1990 <= y <= 2050
思路:记住口诀:四年一闰,百年不闰,四百年又闰
代码:
#include<iostream> using namespace std; int main(){ int y; cin >> y; if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)){ cout << "yes"; } else{ cout << "no"; } return 0; }
BASIC-2 01字串(循环)
问题描述
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串
输入格式
本试题没有输入
输出格式
输出32行,按从小到大的顺序每行一个长度为5的01串
样例输出
00000
00001
00010
00011
<以下部分省略>
思路: 枚举,多重循环
代码:
#include<iostream> using namespace std; int main(){ for (int a = 0; a <= 1; a++) for (int b = 0; b <= 1; b++) for (int c = 0; c <= 1; c++) for (int d = 0; d <= 1; d++) for (int e = 0; e <= 1; e++) cout << a << b << c << d << e << endl; return 0; }
#include<iostream> using namespace std; int main(){ for (int i = 0; i < 32; i++){ cout << i % 32 / 16 << i % 16 / 8 << i % 8 / 4 << i % 4 / 2 << i % 2<<endl; } return 0; }
BASIC-3 字母图形(循环 字符串)
问题描述
利用字母可以组成一些美丽的图形,下面给出了一个例子
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数
输出格式
输出n行,每个m个字符,为你的图形
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
数据规模与约定
1 <= n, m <= 26
思路:同行或者同列的字母,它们相减的绝对值再加上‘A’,就可以输出相应的字母,需要用到abs函数,再用char转换字符类型
代码:
#include<iostream> #include<cmath> using namespace std; int main(){ int n, m; cin >> n >> m; for (int i = 0; i < n; i++){ for (int j = 0; j < m; j++){ cout <<(char)('A' + abs(i - j)); } cout << endl; } return 0; }
BASIC-4 数列特征(循环 最大值 最小值 累加)
问题描述
给出n个数,找出这n个数的最大值,最小值,和
输入格式
第一行为整数n,表示数的个数
第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。
输出格式
输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和
样例输入
5
1 3 -2 4 5
样例输出
5
-2
11
数据规模与约定
1 <= n <= 10000
思路:开数组,初始化变量,输入数列并求和,再判断最大最小值
代码:
#include<iostream> using namespace std; int a[10005]; int main(){ int n, max, min, s = 0; cin >> n; for (int i = 0; i < n; i++){ cin >> a[i]; s += a[i]; } max = a[0]; min = a[0]; for (int j = 1; j < n; j++){ if (a[j] > max){ max = a[j]; } if (a[j] < min){ min = a[j]; } } cout << max << endl; cout << min << endl; cout << s << endl; return 0; }
BASIC-5 查找整数(循环 判断)
问题描述
给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个
输入格式
第一行包含一个整数n
第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000
第三行包含一个整数a,为待查找的数
输出格式
如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1
样例输入
6
1 9 4 8 3 9
9
样例输出
2
数据规模与约定
1 <= n <= 1000
代码:
#include<iostream> using namespace std; int s[1005]; int main(){ int n, a, i; cin >> n; for (i = 0; i < n; i++){ cin >> s[i]; } cin >> a; for (i = 0; i < n; i++){ if (a == s[i]) break; } if (i < n){ cout << i + 1; }else{ cout << "-1"; } return 0; }
BASIC-6 杨辉三角形(基础练习 二维数组)
问题描述
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行
1
1 1
1 2 1
1 3 3 1
给出n,输出它的前n行
输入格式
输入包含一个数n
输出格式
输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格
样例输入
4
样例输出
1
1 1
1 2 1
1 3 3 1
数据规模与约定
1 <= n <= 34
思路:观察样例输出,三角形的竖边和斜边都是1,可以定义一个二维数组,把这两条边上的所有位置都初始化为1,然后利用杨辉三角的公式,输出被这两条边包围的内部数字,最后循环输出整个数组
代码:
#include<iostream> using namespace std; int a[40][40]; int main(){ int n, i, j; cin >> n; for (i = 0; i < n; i++){ a[i][0] = a[i][i] = 1; //初始化1, } for (i = 2; i < n; i++){ for (j = 1; j < i; j++){ a[i][j] = a[i - 1][j - 1] + a[i - 1][j]; //杨辉三角公式 } } for (i = 0; i < n; i++){ for (j = 0; j <= i; j++){ cout << a[i][j] << " "; //输出整个数组 } cout << endl; } return 0; }
#include<iostream> using namespace std; int a[40][40]; int main(){ int n; cin >> n; for (int i = 0; i < n; i++){ for (int j = 0; j <= i; j++){ if (i == 0 || j == i){ a[i][j] = 1; } else{ a[i][j] = a[i - 1][j - 1] + a[i - 1][j]; } cout << a[i][j] << " "; } cout << endl; } return 0; }
BASIC-7 特殊的数字(循环 判断 数位)
问题描述
153是一个非常特殊的数,它等于它的每位数字的立方和即
153=1* 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3编程求所有满足这种条件的三位十进制数
输出格式
按从小到大的顺序输出满足条件的三位十进制数,每个数占一行
思路:枚举+pow函数判断
代码:
#include<iostream> #include<cmath> using namespace std; int main(){ for (int i = 100; i < 1000; i++){ if((pow((i / 10) % 10, 3) + pow(i % 10, 3) + pow(( i / 100) % 10, 3)) == i){ cout << i << endl; } } return 0; }
BASIC-8 回文数(循环 判断 回文数)
问题描述
1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数
输出格式
按从小到大的顺序输出满足条件的四位十进制数
思路:枚举
代码:
#include<iostream> using namespace std; int main(){ for (int i = 1000; i < 10000; i++){ if (i / 1000 == i % 10 && i / 100 % 10 == i / 10 % 10) cout << i << endl; } return 0; }
BASIC-9 特殊回文数(回文数 循环 条件语句)
问题描述
123321是一个非常特殊的数,它从左边读和从右边读是一样的
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n
输入格式
输入一行,包含一个正整数n
输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
1<=n<=54
思路:枚举枚举
代码:
#include<iostream> using namespace std; int main(){ int n; cin >> n; for (int i = 10000; i < 100000; i++){ int a, b, c, d, e, g; a = i / 10000; b = i / 1000 % 10; c = i / 100 % 10; d = i / 10 % 10; e = i % 10; if (a == e && b == d && (n == a + b + c + d + e)){ cout << i << endl; } } for (int j = 100000; j < 1000000; j++){ int a, b, c, d, e, f; a = j / 100000; b = j / 10000 % 10; c = j / 1000 % 10; d = j / 100 % 10; e = j / 10 % 10; f = j % 10; if (a == f && b == e && c == d &&(n == a + b + c + d + e + f)){ cout << j << endl; } } return 0; }
BASIC-10 十进制转十六进制(循环 整除 求余 判断)
问题描述
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E
给出一个非负整数,将它表示成十六进制的形式
输入格式
输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
输出格式
输出这个整数的16进制表示
样例输入
30
样例输出
1E
思路:定义fun函数,递归,然后分别对16取整和取余,再在主函数中调用
代码:
#include<iostream> using namespace std; void fun(int n){ if (n / 16) fun(n / 16); int a = n % 16; if (a < 10){ cout << (char) (a + '0'); } else{ cout << (char)(a + 'A' - 10); } } int main(){ int n; cin >> n; fun(n); return 0; }
BASIC-11 十六进制转十进制(进制转换 字符处理 判断)
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示
样例输入
FFFF
样例输出
65535
思路:0~9公式:(16进制的第i位数字-‘0’)*16^i - 1
>=A公式: (16进制的第i位数字-‘A’ +10)*16^i - 1
代码:
#include<iostream> #include<cmath> using namespace std; int main(){ string s; cin >> s; long long sum = 0; for (int i = 0; i < s.length(); i++){ if (s[i] >= '0' && s[i] <= '9'){ sum += (s[i] - '0') * pow(16, s.length() - i - 1); } else if (s[i] == 'A'){ sum += 10 * pow(16, s.length() - i - 1); } else if (s[i] == 'B'){ sum += 11 * pow(16, s.length() - i - 1); } else if (s[i] == 'C'){ sum += 12 * pow(16, s.length() - i - 1); } else if (s[i] == 'D'){ sum += 13 * pow(16, s.length() - i - 1); } else if (s[i] == 'E'){ sum += 14 * pow(16, s.length() - i - 1); } else if (s[i] == 'F'){ sum += 15 * pow(16, s.length() - i - 1); } } cout << sum << endl; return 0; }
BASIC-12 十六进制转八进制(进制转换 字符 循环)
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
思路:先将十六进制数转换成某进制数,再由某进制数转换成八进制
代码:
#include <iostream> #include <string> using namespace std; int main() { int n; cin >> n; for(int k = 0; k < n; k++) { string s1,s2; cin >> s1; s2 = ""; for(int i = 0; i < s1.length(); i++) { switch(s1[i]) { case '0': s2 += "0000"; break; case '1': s2 += "0001"; break; case '2': s2 += "0010"; break; case '3': s2 += "0011"; break; case '4': s2 += "0100"; break; case '5': s2 += "0101"; break; case '6': s2 += "0110"; break; case '7': s2 += "0111"; break; case '8': s2 += "1000"; break; case '9': s2 += "1001"; break; case 'A': s2 += "1010"; break; case 'B': s2 += "1011"; break; case 'C': s2 += "1100"; break; case 'D': s2 += "1101"; break; case 'E': s2 += "1110"; break; case 'F': s2 += "1111"; break; default: break; } } int len = s2.length(); if(len % 3 == 1){ s2 = "00" + s2; }else if( len % 3 == 2){ s2 = "0" + s2; } int flag = 0; for(int i = 0; i <= s2.length() - 3; i += 3) { int num = 4 * (s2[i] - '0') + 2 * (s2[i+1] - '0') + (s2[i + 2] - '0'); if(num){ flag=1; } if(flag){ cout << num; } } cout << endl; } return 0; }
BASIC-13 数列排序(数组 排序)
问题描述
给定一个长度为n的数列,将这个数列按从小到大的顺序排列
1<=n<=200
输入格式
第一行为一个整数n
第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000
输出格式
输出一行,按从小到大的顺序输出排序后的数列
样例输入
5
8 3 6 4 9
样例输出
3 4 6 8 9
思路:利用algorithm里的sort排序
代码:
#include<iostream> #include<algorithm> using namespace std; int num[10005]; int main(){ int n; cin >> n; for (int i = 0; i < n; i++){ cin >> num[i]; } sort(num, num + n); for (int i = 0; i < n; i++){ cout << num[i] << " "; } return 0; }
- 点赞
- 收藏
- 分享
- 文章举报
- 蓝桥杯-基础练习之BASIC-13数列排序(vector实现)
- c++实现冒泡排序——以蓝桥杯【基础练习】【数列排序】为例
- 蓝桥杯 练习系统 基础练习 阶乘计算(C++)
- 蓝桥杯练习系统试题集(二)--基础练习(含C/C++答案)
- 【蓝桥杯练习系统】 基础练习 字母图形
- 【蓝桥杯练习系统】 基础练习 数列排序
- (蓝桥杯)基础练习BASIC-4——数列特征C++
- 【蓝桥杯练习系统】 基础练习 特殊的数字
- 蓝桥杯 BASIC-13 基础练习 数列排序
- 蓝桥杯 基础练习 杨辉三角形(C++)
- [蓝桥杯][基础练习VIP]字符串对比--java实现
- 【蓝桥杯练习系统】 基础练习 十六进制转十进制
- 蓝桥杯( JAVA )——基础练习1-13
- 蓝桥杯练习系统试题集(一)--入门练习(含C/C++答案)
- 蓝桥杯——基础练习 字母图形 Java实现
- 蓝桥杯 基础练习 Huffuman树(C++)
- 项目经理带你-零基础学习C++_新手学习笔记VS2010_1 项目3-黑客攻击系统-输入的优化-48.项目需求-项目实现
- 蓝桥杯python 基础练习13 数列排序
- 蓝桥杯比赛C++学习-----基础练习 阶乘计算
- 蓝桥杯软件大赛练习系统——基础练习 十进制转十六进制