您的位置:首页 > 编程语言 > C语言/C++

蓝桥杯 练习系统 基础练习(1~13)(C++实现)

2020-04-23 13:45 435 查看

整理了练习系统基础练习的前13道题目的代码(每道题的方法肯定不止一种,先暂且这样,以后补)

目录

BASIC-1 闰年判断(条件判断)

问题描述
给定一个年份,判断这一年是不是闰年
当以下情况之一满足时,这一年是闰年

  1. 年份是4的倍数而不是100的倍数
  2. 年份是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;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
昨日不归鹿 发布了4 篇原创文章 · 获赞 7 · 访问量 1544 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: