作为第一次参加蓝桥杯的小白,我特别想创建一个专门的文章来记录这几个月的练习过程,没怎么写过文章,所以文章内容会很呆板,再加上之前学习的c++差不多已经忘光了。希望各位大佬看到这篇文章时,可以为我提一些意见,这些意见就是我最大的鼓励!
在练习的过程中难免会遇见对于我来说很有价值的问题,各位大佬可以忽略自我总结部分,因为主要是为我而写,就写的很差T T。
在练习之前,需要选择一个编译器来提升代码的熟练度,这里我直接使用的是蓝桥杯提供的dev-cpp软件,当然也可以用VsCode,只要写全了头文件,对于训练过程没有太大的影响。
一、数列排序问题:给定一个长度为n的数列,将这个数列按从小到大的顺序排列。(1<=n<=200)
#include#include #include *(data+j+1)) { swap(*(data+j),*(data+j+1)); } } } for(i=0;i Maxsize) { printf("请输入合法数组长!请重新输入:"); scanf("%d",&num); } data=(int *)malloc(num*sizeof(int)); for(int i=0;i >data[i]; } Order(data,num); return 0; }
结果:
本题总结:
- 在蓝桥杯的比赛中,使用的是老版软件Dev-cpp,因此在写c++时的头文件要齐全,如这道题中,原本我只写了
的头文件,导致printf、scanf和malloc函数编译器无法识别,因此要写全所有的头文件!!!! - 在想输入一串数组数据又不想只能用回车当间隔符,可以不使用scanf的标准输入,而使用cin输入流,因为cin中输入空格等空白符是不会记录下来的,因此不仅可以用回车还可以用空格、制表符等等。等待到所有的数组数据输入完成,回车就可以退出cin输入流。
- swap()函数在c中的algorithm.h头文件中,在c++中的iostream.h头文件中。swap()中函数的形参设为指针,然后将指针上对应的数值进行交换,地址上的值就会改变。由于传递的是两个变量的内存地址(指针)使得我们可以直接操作对应的值。
void swap(int &a, int &b) { int temp = a; a = b; b = temp; }- 冒泡排序学习
(原文:JS-Sorting-Algorithm/bubbleSort.md at master · hustcc/JS-Sorting-Algorithm · GitHub)
二、十六进制转八进制(本题代码内容参考他人,非原创)
问题:给定n个十六进制正整数,输出它们对应的八进制数。
#include#include #include #include using namespace std; #define Maxsize 10 #define Minsize 1 int main() { int num; cin >>num; for(int i=0;i >sixteen; for(int j=0;j 结果:
本题总结:
这道题我在写时,原本以为它需要先转换成十进制,再从十进制转换成八进制,这个方法虽然没问题,但是在写代码时发现过于复杂(还是可以实现的!),后来参考别人写的代码时发现,他们使用的都是二进制作为中间变量,这样就简单很多,因为十六进制中需要四位二进制数,而八进制需要三位二进制数,这样只需要将被转换数变成二进制,并从二进制数中以3为单位取数,从而转换成八进制。
但是要注意,这个方法需要检查二进制数是否为3的倍数,通过余数判断是否要在前面补零,余数为1时,说明还差两个凑齐3,补两个0;余数为2时,同理。
三、十六进制转十进制问题:从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
#include#include #include #include using namespace std; int main() { string sixteen; //注意一定要写longlong型,因为当输入FFFFFFFF时,会超出int等类型的范围! long long ten=0; string two; cin >>sixteen; for(int i=0;i 结果:
本题总结:
在第一次写这题时,我想因为是十进制,就和我们平时使用的数学计算的进制是一样的,但我没考虑到的是使用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#include #include #include using namespace std; int main() { unsigned int ten; unsigned int chushu;//暂存ten/16 unsigned int yushu;//暂存chushu%16 string sixteen; scanf("%d",&ten); chushu=ten; //要特别注意ten=0的情况,因为我使用的while循环内需要chushu不为零! if(ten==0) { cout <<'0' < 结果:
本题总结:
题目要求输入的是一个非负整数,因此使用unsigned int来限制,由于每除16表示十六进制的一位数,因此当非零十进制除16不为零时,就说明十六进制后面还有位数,直到除成零。但是这个条件是当输入的数是非零十进制数,因此还要再前面加一个特殊情况,当输入就是零本身时,十六进制也是输出零。



