前言

作为第一次参加蓝桥杯的小白,我特别想创建一个专门的文章来记录这几个月的练习过程,没怎么写过文章,所以文章内容会很呆板,再加上之前学习的c++差不多已经忘光了。希望各位大佬看到这篇文章时,可以为我提一些意见,这些意见就是我最大的鼓励!

在练习的过程中难免会遇见对于我来说很有价值的问题,各位大佬可以忽略自我总结部分,因为主要是为我而写,就写的很差T T。

在练习之前,需要选择一个编译器来提升代码的熟练度,这里我直接使用的是蓝桥杯提供的dev-cpp软件,当然也可以用VsCode,只要写全了头文件,对于训练过程没有太大的影响。

一、数列排序

问题:给定一个长度为n的数列,将这个数列按从小到大的顺序排列。(1<=n<=200)

#include <iostream>
#include <stdio.h>
#include <stdlib.h
#define Maxsize 200
#define Minsize 1using namespace std;void Order(int *data,int num)
{int i,j;for(i=0;i<num-1;i++){for(j=0;j<num-1;j++){if(*(data+j)>*(data+j+1)){swap(*(data+j),*(data+j+1));}}}for(i=0;i<num;i++){printf("%d ",*(data+i));}
}int main()
{int num;//数组长int *data;scanf("%d",&num);if(num<Minsize || num>Maxsize){printf("请输入合法数组长!请重新输入:");scanf("%d",&num);}data=(int *)malloc(num*sizeof(int));for(int i=0;i<num;i++){cin >>data[i];}Order(data,num);return 0;
}

结果:

本题总结:

  1. 在蓝桥杯的比赛中,使用的是老版软件Dev-cpp,因此在写c++时的头文件要齐全,如这道题中,原本我只写了<iostream>的头文件,导致printf、scanf和malloc函数编译器无法识别,因此要写全所有的头文件!!!!
  2. 在想输入一串数组数据又不想只能用回车当间隔符,可以不使用scanf的标准输入,而使用cin输入流,因为cin中输入空格等空白符是不会记录下来的,因此不仅可以用回车还可以用空格、制表符等等。等待到所有的数组数据输入完成,回车就可以退出cin输入流。
  3. swap()函数在c中的algorithm.h头文件中,在c++中的iostream.h头文件中。swap()中函数的形参设为指针,然后将指针上对应的数值进行交换,地址上的值就会改变。由于传递的是两个变量的内存地址(指针)使得我们可以直接操作对应的值。
    void swap(int &a, int &b)
    {int temp = a;a = b;b = temp;
    }
    
  4. 冒泡排序学习

(原文:JS-Sorting-Algorithm/bubbleSort.md at master · hustcc/JS-Sorting-Algorithm · GitHub)

二、十六进制转八进制(本题代码内容参考他人,非原创)

问题:给定n个十六进制正整数,输出它们对应的八进制数。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
#define Maxsize 10
#define Minsize 1int main()
{int num;cin >>num;for(int i=0;i<num;i++){string sixteen;string eight;string two;cin >>sixteen;for(int j=0;j<sixteen.length();j++){switch(sixteen[j]){case '0':two+="0000";break;case '1':two+="0001";break;case '2':two+="0010";break;case '3':two+="0011";break;case '4':two+="0100";break;case '5':two+="0101";break;case '6':two+="0110";break;case '7':two+="0111";break;case '8':two+="1000";break;case '9':two+="1001";break;case 'a':case 'A':two+="1010";break;case 'b':case 'B':two+="1011";break;case 'c':case 'C':two+="1100";break;case 'd':case 'D':two+="1101";break;case 'e':case 'E':two+="1110";break;case 'f':case 'F':two+="1111";break; }}if(two.length()%3==2){two="0"+two;}if(two.length()%3==1){two="00"+two;}if(!(two[0]=='0' && two[1]=='0' && two[2]=='0')){char temp;temp=(two[0]-'0')*4+(two[1]-'0')*2+two[2];eight+=temp;}for(int j=3;j<two.length();j+=3){eight+=(two[j]-'0')*4+(two[j+1]-'0')*2+two[j+2];}cout <<eight <<endl;}return 0;
}

结果:

本题总结:

这道题我在写时,原本以为它需要先转换成十进制,再从十进制转换成八进制,这个方法虽然没问题,但是在写代码时发现过于复杂(还是可以实现的!),后来参考别人写的代码时发现,他们使用的都是二进制作为中间变量,这样就简单很多,因为十六进制中需要四位二进制数,而八进制需要三位二进制数,这样只需要将被转换数变成二进制,并从二进制数中以3为单位取数,从而转换成八进制。

但是要注意,这个方法需要检查二进制数是否为3的倍数,通过余数判断是否要在前面补零,余数为1时,说明还差两个凑齐3,补两个0;余数为2时,同理。

三、十六进制转十进制

问题:从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>using namespace std;int main()
{string sixteen;//注意一定要写longlong型,因为当输入FFFFFFFF时,会超出int等类型的范围!long long ten=0;string two;cin >>sixteen;for(int i=0;i<sixteen.length();i++){switch(sixteen[i]){case '0':two+="0000";break;case '1':two+="0001";break;case '2':two+="0010";break;case '3':two+="0011";break;case '4':two+="0100";break;case '5':two+="0101";break;case '6':two+="0110";break;case '7':two+="0111";break;case '8':two+="1000";break;case '9':two+="1001";break;case 'a':case 'A':two+="1010";break;case 'b':case 'B':two+="1011";break;case 'c':case 'C':two+="1100";break;case 'd':case 'D':two+="1101";break;case 'e':case 'E':two+="1110";break;case 'f':case 'F':two+="1111";break; }}//二进制转十进制的算法for(int i=0;i<two.length();i++){if(two[i]=='1'){ten+=pow(2,two.length()-1-i);}else{ten+=0;}}cout <<ten <<endl;return 0;
}

结果:

本题总结:

在第一次写这题时,我想因为是十进制,就和我们平时使用的数学计算的进制是一样的,但我没考虑到的是使用int、long int、double等都会显示不全,只有long long的范围才足够显示。

类型 字节 取值范围
signed char 1 -128 ~ +127
short int 2 -32768 ~ +32767
int 4 -2147483648 ~ +2147483647
long int 4 -2147483648 ~ +2141483647
long long int 8 -9223372036854775808 ~ 9223372036854775807

四、十进制转十六进制

问题:给出一个非负整数,将它表示成十六进制的形式。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>using namespace std;int main()
{unsigned int ten;unsigned int chushu;//暂存ten/16 unsigned int yushu;//暂存chushu%16string sixteen;scanf("%d",&ten);chushu=ten;//要特别注意ten=0的情况,因为我使用的while循环内需要chushu不为零!if(ten==0){cout <<'0' <<endl;}else{while(chushu){yushu=chushu%16;chushu=chushu/16;//通过余数判断是哪个符号switch(yushu){case 0:sixteen='0'+sixteen;break;case 1:sixteen='1'+sixteen;break;case 2:sixteen='2'+sixteen;break;case 3:sixteen='3'+sixteen;break;case 4:sixteen='4'+sixteen;break;case 5:sixteen='5'+sixteen;break;case 6:sixteen='6'+sixteen;break;case 7:sixteen='7'+sixteen;break;case 8:sixteen='8'+sixteen;break;case 9:sixteen='9'+sixteen;break;case 10:sixteen='A'+sixteen;break;case 11:sixteen='B'+sixteen;break;case 12:sixteen='C'+sixteen;break;case 13:sixteen='D'+sixteen;break;case 14:sixteen='E'+sixteen;break;case 15:sixteen='F'+sixteen;break;}}}cout <<sixteen <<endl;return 0;
}

结果:

本题总结:

题目要求输入的是一个非负整数,因此使用unsigned int来限制,由于每除16表示十六进制的一位数,因此当非零十进制除16不为零时,就说明十六进制后面还有位数,直到除成零。但是这个条件是当输入的数是非零十进制数,因此还要再前面加一个特殊情况,当输入就是零本身时,十六进制也是输出零。

五、特殊回文数

问题:输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>using namespace std;int main()
{int num,sum,a[6];scanf("%d",&num);for(int i=10000;i<=999999;i++){a[0]=i/100000;a[1]=i/10000%10;a[2]=i/1000%10;a[3]=i/100%10;a[4]=i/10%10;a[5]=i%10;sum=a[0]+a[1]+a[2]+a[3]+a[4]+a[5];//六位if(a[0]!=0){if(sum==num &&a[0]==a[5] &&a[1]==a[4] &&a[2]==a[3]){printf("%d\n",i);}}//五位中位数不用比较else{if(sum==num &&a[1]==a[5] &&a[2]==a[4]){printf("%d\n",i);}}}return 0;
} 

结果:

本题总结:

本题思路比较简单,就是从10000(五位数开始数)~999999(六位数结束数)穷举,并把每次得到的数每一位分别存进a[6]这个数组中,通过对比总和、回文位来判断要不要输出。

六、回文数

问题:编程求所有这样的四位十进制数。(要求:按从小到大的顺序输出满足条件的四位十进制数。)

#include <iostream>
#include <stdio.h>
#include <stdlib.h>using namespace std;
//由于是四位十进制数,故a[0]和a[3]不能为0,范围从1到9
int main()
{int a[4];for(int i=1;i<10;i++){for(int j=0;j<10;j++){a[0]=i;a[3]=a[0];a[1]=j;a[2]=a[1];for(int m=0;m<4;m++){printf("%d",a[m]);}printf("\n");}} return 0;
}

结果:(本题无总结,题目比较简单)

七、特殊的数字

问题:153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。(要求:按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。)

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>using namespace std;int main()
{int a[3];for(int i=100;i<=999;i++){a[0]=i/100;a[1]=i/10%10;a[2]=i%10;if(i==pow(a[0],3)+pow(a[1],3)+pow(a[2],3)){printf("%d\n",i);}}return 0;
}

结果:(本题无总结,题目比较简单)

八、杨辉三角形

问题:给出n,输出杨辉三角的前n行。(要求:每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。)

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 34
#define Minsize 1using namespace std;int main()
{int n;//杨辉三角的行数 int yh[Maxsize][Maxsize];scanf("%d",&n);//错误检测 while(!(n>=Minsize &&n<=Maxsize)){scanf("%d",&n);}//定义三角两边的数全为1for(int i=0;i<n;i++){yh[i][0]=1;yh[i][i]=1;}for(int i=2;i<n;i++){   //从第3行开始,数等于上一行两数之和for(int j=1;j<=i-1;j++){yh[i][j]=yh[i-1][j-1]+yh[i-1][j];}}for(int i=0;i<n;i++){for(int j=0;j<=i;j++){printf("%d ",yh[i][j]);}printf("\n");}return 0;
}

结果:

本题总结:

杨辉三角的题目其实除了用二维数组来表达以外,还可以用组合数的方法表达。以下是杨辉三角有关的定义:

1、每个数等于它上一行两个数的和(本题方法);

2、第n行共有n个数;

3、第n行的m个数可以表示为C(n-1,m-1),即组合数方法。

九、查找整数

问题:给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 1000
#define Minsize 1using namespace std;int main()
{int n,a;int *data;scanf("%d",&n);//错误检测 while(!(n>=Minsize &&n<=Maxsize)){scanf("%d",&n);}data=(int *)malloc(n*sizeof(int));for(int i=0;i<n;i++){cin >>data[i];}scanf("%d",&a);for(int i=0;i<n;i++){   //找到第一个则跳出if(a==data[i]){printf("%d",i+1);break;}//最后一个都没找到,说明没有这个数else if(i==n-1 &&!(a==data[i])){printf("%d",-1);break;}}return 0;
}

结果:(本题无总结,题目比较简单)

十、数列特征

问题:给出n个数,找出这n个数的最大值,最小值,和。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 10000
#define Minsize 1using namespace std;
//最小
int min_fun(int *data,int n)
{int min=data[0];for(int i=1;i<n;i++){if(min>data[i]){min=data[i];}}return min;
}
//最大
int max_fun(int *data,int n)
{int max=data[0];for(int i=1;i<n;i++){if(max<data[i]){max=data[i];}}return max;
}
//和
int sum_fun(int *data,int n)
{int sum=0;for(int i=0;i<n;i++){sum=sum+data[i];}return sum;
}int main()
{int n,min,max,sum;int *data;scanf("%d",&n);//错误检测 while(!(n>=Minsize &&n<=Maxsize)){scanf("%d",&n);}data=(int *)malloc(n*sizeof(int));for(int i=0;i<n;i++){cin >>data[i];}min=min_fun(data,n);max=max_fun(data,n);sum=sum_fun(data,n);printf("%d\n",max);printf("%d\n",min);printf("%d\n",sum);return 0;
}

结果:(本题无总结,题目比较简单)

十一、高精度加法

问题:输入两个整数ab,输出这两个整数的和。ab都不超过100位。

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;int main()
{char num1[101],num2[101];int l1,l2;int a[101]={0},b[101]={0},c[200]={0};int temp_a,temp_b;int carry=0;//进位 int add_n;//不带进位的计算结果 int sum_n;//带进位的初始结果 //输入 cin >>num1 >>num2;//数字放入数组l1=strlen(num1);l2=strlen(num2);for(int i=0;i<101;i++){if(num1[i]!='\0'){a[l1-1-i]=num1[i]-'0';}else{break;}}for(int i=0;i<101;i++){if(num2[i]!='\0'){b[l2-1-i]=num2[i]-'0';}else{break;}}//找下标 for(int i=100;i>=0;i--){if(a[i]!=0){temp_a=i;break;}}for(int i=100;i>=0;i--){if(b[i]!=0){temp_b=i;break;} }for(int i=0;i<101;i++){sum_n=a[i]+b[i]+carry;carry=sum_n/10;add_n=sum_n%10;c[i]=add_n;}int end;for(int i=100;i>=0;i--){if(c[i]!=0){end=i;break;}}for(int i=end;i>=0;i--){cout <<c[i];}return 0;
}

结果:

本题总结:

1、在输入时不能直接输入进整型数组,应该借助字符串数组来存放每位的数字;

2、每个数的排放顺序应从低位到高位,因为一个数的最高位一定不能为0,所以通过初始化可以找到最高位的下标!

蓝桥杯-基础练习题(自我总结)(持续更新中...)相关推荐

  1. 2019年第十届蓝桥杯真题python解答(更新中)

    1. 后缀表达式 首先要了解什么是后缀表达式: 后缀表达式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则). 由于后缀表达式 ...

  2. 蓝桥杯基础练习题3(16进制转8进制)1

    系统显示测试超时...尴尬 #include<cstdio> #include<iostream> #include<cstring> #include<ma ...

  3. MySQL基础学习笔记(持续更新中)

    一.MySQL基础 1. 数据库概念 1.1 为什么要学MySQL 个人理解:随着互联网的发展,数据变得烦杂,冗余,量大,为了保证数据的持久性以及健壮性等等,同时也为了方便人们很好的处理数据,这就发明 ...

  4. Linux基础知识汇总(2)...持续更新中

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  5. 网页制作之JavaScript部分3--事件及事件传输方式(函数调用 练习题 )重要---持续更新中...

    一. 事件:说白了就是调用函数的一种方式.它包括:事件源.事件数据.事件处理程序. JS事件 1.js事件通常和函数结合来使用,这样可以通过发生的事件来驱动函数的执行,从而引起html出现不同的效果. ...

  6. 渗透学习-文件上传篇-基础知识部分(持续更新中)

    提示:仅供进行学习使用,请勿做出非法的行为.如若由任何违法行为,将依据法律法规进行严惩!!! 文章目录 前言 一.文件上传漏洞简要阐述 文件上传是什么? 为什么会产生文件上传漏洞?及其可能一哪些危害? ...

  7. 莫烦Python Python基础教程 文字版 持续更新中

    打开IDLE开始干活 * 函数 1. 注意函数名后冒号 2. 多行语句无{ },函数名后四个空格对齐属于函数部分 3. 这样定义的函数 可以这样调用4.print可以直接回车换行,多行书写 5.函数默 ...

  8. 【学习笔记】【PS】基础学习篇(持续更新中...)

    [视频地址]:https://www.bilibili.com/video/BV1YW411e7n5?p=1 目录 主界面:菜单栏.选项栏.工具栏.面板 常用分辨率设置 颜色模式 像素公式 前期的常规 ...

  9. ECharts数据可视化项目-大屏数据可视化【持续更新中】

    ECharts数据可视化项目-大屏数据可视化[持续更新中] 文章目录 ECharts数据可视化项目-大屏数据可视化[持续更新中] 一. 数据可视化ECharts使用 二.技术栈 三.数据可视化 四.可 ...

最新文章

  1. windows7 下的日期没有internet时间的选项卡
  2. 嵌入式MVN指令解析
  3. 组播穿越MPLS ×××+SSM
  4. 2018.12.22 spoj7258 Lexicographical Substring Search(后缀自动机)
  5. Tensorflow详解保存模型(基础版)
  6. win7计算机用户名在哪找,win7 c盘里找不到users,用户里也没有C:#92;User...-win7电脑c盘USERS文件夹在哪...
  7. 9:16 2009-7-30 范型,IList 做为参数
  8. 怎么清洁计算机主机内部,详细说明清理网吧中计算机主机的正确方法
  9. Zabbix监控Dell服务器主机和网络设备
  10. 项目实战中的防御性编程
  11. matlab差分法解拉普拉斯方程,拉普拉斯方程有限差分法的MATLAB实现
  12. 问题:必须使用记录或另一备份以恢复包含系统注册表
  13. android10存储空间不足怎么清理,手机磁盘空间不足怎么清理?详细介绍
  14. [转]杀毒软件的引擎
  15. 介绍计算机方队,方阵
  16. 【2019年04月04日】股市指数估值排名
  17. 关于Intel文档的下载问题
  18. 浅谈vue项目进阶开发-杂谈1
  19. ImportError: cannot import name ‘open_code‘ from ‘io‘ (unknown location)解决方案
  20. java中 先进后出的集合_程序猿的日常——Java中的集合列表

热门文章

  1. 计算机q启动时有logo,怎么取消电脑开机显示logo
  2. 转:Yahoo邮箱POP、SMTP服务器设置详解
  3. stlink使用笔记
  4. 手动安装m4, autoconf, automake, libtool
  5. python 递归函数 匿名函数
  6. 【单镜头反光相机】Nikon尼康
  7. 花生壳实现内网穿透这一文就够了
  8. java栈实现--顺序栈
  9. 3.3带误差线的柱状图
  10. 解决 HP Deskjet 1000 打印字体模糊