【蓝桥杯】试题集-基础练习-完整版(附百分代码及部分解释)

“蓝桥杯”练习系统 (lanqiao.cn) 

目录

1.A+B问题

2.数列排序

3.十六进制转八进制

4.十六进制转十进制

5.十进制转十六进制

6.特殊回文数

7.回文数

8.特殊的数字

9.杨辉三角形

10.查找整数

11.数列特征

12.字母图形

13.01字串

14.闰年判断

15.Fibonacci数列

16.圆的面积

17.序列求和

18.阶乘计算

19.高精度加法

20.Huffuman树

21.2n皇后问题

22.报时助手

23.回形取数

24.龟兔赛跑预测

25.芯片测试

26.FJ的字符串

27.Sine之舞

28.数的读法

29.完美的代价

30.矩形面积交

31.矩阵乘法

32.分解质因数

33.字符串对比

34.时间转换 


1.A+B问题

#include<bits/stdc++.h>
using namespace std;
int main(){
	int A,B;
	cin>>A>>B;
	cout<<A+B<<endl;
	return 0;
}

2.数列排序

给定一个长度为n的数列,将这个数列按从小到大的顺序排列。

输出一行,按从小到大的顺序输出排序后的数列。

  • 冒泡排序法:基本原理是两两比较待排序数据的大小 ,当两个数据的次序不满足顺序条件时即进行交换,反之,则保持不变,这样每次最小(或最大)的结点就像气泡一样浮到序列的最前位置。
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	int a[n];
	for(int i=0; i<n;i++){
		cin>>a[i];	
	}
	//COMPARE
	int temp=0;
	for(int i=0; i<n-1; i++){//-1防止数组角标越界
		for(int j=0; j<n-i-1; j++){
			if(a[j+1]<a[j]) {
				//temp=a[j+1];
				//a[j+1]=a[j];
				//a[j]=temp;	
				swap(a[j+1],a[j]);
			}
		}		
	}
	
	for(int i=0; i<n;i++){
		cout<<a[i]<<" " ;	
	}
	return 0;
}

3.十六进制转八进制

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

  • 十六进制:0~9 A~F    0000~1111
  • 八进制:0~7  000~111

C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。 

strcpy(Arry_eight,Arrx.c_str());
#include<bits/stdc++.h> 
using namespace std;
//二进制-八进制
void transform_8(string Arrx) {
	int n;
	n=Arrx.length();
	//检查是否需要补0 
	if(n%3==1) Arrx = "00"+Arrx;
	else if(n%3==2) Arrx = "0"+Arrx;
	//更新长度
	n=Arrx.length();
	char Arry_eight[n];
	//C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。 
	strcpy(Arry_eight,Arrx.c_str());
	int i,j;
	//八进制位数 
	i=n/3; 
	//字符数组对应的八进制位数,数组从0开始计数 
	j=i-1; 	
	//数组前三均为0,则八进制此处为0,不在记录 
	if(Arry_eight[0]=='0'&&Arry_eight[1]=='0'&&Arry_eight[2]=='0') {
		j--;
		i--;
	}
	//八进制的个数为i 
	char Arrx_eight[i];
	//3位一组 
	int x, y, z;
	x=n-1;
	y=n-2;
	z=n-3;
	for(int k= i; k>0; k--){
		 if(Arry_eight[z]=='0'&&Arry_eight[y]=='0'&&Arry_eight[x]=='0') Arrx_eight[j]='0'; 
		 else if(Arry_eight[z]=='0'&&Arry_eight[y]=='0'&&Arry_eight[x]=='1') Arrx_eight[j]='1';  
		 else if(Arry_eight[z]=='0'&&Arry_eight[y]=='1'&&Arry_eight[x]=='0') Arrx_eight[j]='2';  
		 else if(Arry_eight[z]=='0'&&Arry_eight[y]=='1'&&Arry_eight[x]=='1') Arrx_eight[j]='3'; 
		 else if(Arry_eight[z]=='1'&&Arry_eight[y]=='0'&&Arry_eight[x]=='0') Arrx_eight[j]='4';  
		 else if(Arry_eight[z]=='1'&&Arry_eight[y]=='0'&&Arry_eight[x]=='1') Arrx_eight[j]='5';
		 else if(Arry_eight[z]=='1'&&Arry_eight[y]=='1'&&Arry_eight[x]=='0') Arrx_eight[j]='6';  
		 else if(Arry_eight[z]=='1'&&Arry_eight[y]=='1'&&Arry_eight[x]=='1') Arrx_eight[j]='7'; 
		 j--;
		 x-=3;
		 y-=3;
		 z-=3;
	} 
	for(int p=0; p<i; p++){
		cout<<Arrx_eight[p];
	}
	cout<<endl;	 
}


//十六进制-二进制
void transform_2(char num[], int n){
	string Arry[n];
	string Arrx;
	for(int i=0; i<n; i++){
		//如果为数字 
		if(num[i]=='0'||num[i]=='1'||num[i]=='2'||num[i]=='3'||num[i]=='4'
		 ||num[i]=='5'||num[i]=='6'||num[i]=='7'||num[i]=='8'||num[i]=='9'){
		 	if(num[i]=='0' && i!=0) Arry[i]="0000";
		 	if(num[i]=='1') Arry[i]="0001";
		 	if(num[i]=='2') Arry[i]="0010";
		 	if(num[i]=='3') Arry[i]="0011";
		 	if(num[i]=='4') Arry[i]="0100";
		 	if(num[i]=='5') Arry[i]="0101";
		 	if(num[i]=='6') Arry[i]="0110";
		 	if(num[i]=='7') Arry[i]="0111";
		 	if(num[i]=='8') Arry[i]="1000";
		 	if(num[i]=='9') Arry[i]="1001";
		 } 
		else if(num[i]=='A' || num[i]=='a') Arry[i]="1010";
		else if(num[i]=='B' || num[i]=='b') Arry[i]="1011";
		else if(num[i]=='C' || num[i]=='c') Arry[i]="1100";
		else if(num[i]=='D' || num[i]=='d') Arry[i]="1101";
		else if(num[i]=='E' || num[i]=='e') Arry[i]="1110";
		else if(num[i]=='F' || num[i]=='f') Arry[i]="1111";	 
	}
	//字符串合并
	for(int i=0; i<n; i++) {
		Arrx += Arry[i];
	}
	//转换成八进制 
	transform_8(Arrx);
}

int main(){
	int n; 
	//n行
	cin>>n; 
	string aa[n];
	//输入字符串 
	for(int i=0; i<n; i++){
		cin>>aa[i];
	} 
	//将每个字符串转成字符数组进行定位
	for(int i=0; i<n; i++){
		string a=aa[i];
		char c[aa[i].length()];
		//把字符串转换成字符指针,string转换成char* ,然后再将字符指针转换到字符数组C里面
		strcpy(c,a.c_str()); 
		//转换成二进制 
		transform_2(c,aa[i].length());
	} 
	return 0;
}

4.十六进制转十进制

从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。

  • 不超过八位十六进制,如果用来存储答案的是int类型的话,输入样例FFFFFFFF答案是错误的,因为FFFFFFFF对应的十进制数是4294967295大于了int的范围,所以以答案所需要使用的数据类型是长整数类型。
#include<bits/stdc++.h>
using namespace std;
//转换为二进制 
void transform_2(char num[], int n){
	string Arry[n];
	string Arrx;
	for(int i=0; i<n; i++){
		//如果为数字 
		if(num[i]=='0'||num[i]=='1'||num[i]=='2'||num[i]=='3'||num[i]=='4'
		 ||num[i]=='5'||num[i]=='6'||num[i]=='7'||num[i]=='8'||num[i]=='9'){
		 	if(num[i]=='0' && i!=0) Arry[i]="0000";
		 	if(num[i]=='1') Arry[i]="0001";
		 	if(num[i]=='2') Arry[i]="0010";
		 	if(num[i]=='3') Arry[i]="0011";
		 	if(num[i]=='4') Arry[i]="0100";
		 	if(num[i]=='5') Arry[i]="0101";
		 	if(num[i]=='6') Arry[i]="0110";
		 	if(num[i]=='7') Arry[i]="0111";
		 	if(num[i]=='8') Arry[i]="1000";
		 	if(num[i]=='9') Arry[i]="1001";
		 } 
		else if(num[i]=='A' || num[i]=='a') Arry[i]="1010";
		else if(num[i]=='B' || num[i]=='b') Arry[i]="1011";
		else if(num[i]=='C' || num[i]=='c') Arry[i]="1100";
		else if(num[i]=='D' || num[i]=='d') Arry[i]="1101";
		else if(num[i]=='E' || num[i]=='e') Arry[i]="1110";
		else if(num[i]=='F' || num[i]=='f') Arry[i]="1111";	 
	}
	//字符串合并
	for(int i=0; i<n; i++) {
		Arrx += Arry[i];
	}
	int len=Arrx.length();
	long long res=0;        //重要说明,即注意事项
	for(int i=0; i<len;i++){
		if(Arrx[i]=='1'){
			res+=pow(2,len-1-i);
		}
	} 
	cout<<res;
}

int main(){
	string s;
	cin>>s;
	char c[s.length()];
	strcpy(c,s.c_str());
	transform_2(c,s.length());
	return 0;
}

5.十进制转十六进制

十六进制数是在程序设计时经常要使用到的一种整数的表示方式。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。
给出一个非负整数,将它表示成十六进制的形式。

#include <iostream>
using namespace std;
int main()
{
    int a;
    cin>>a;
    int yu=a%16; //取余数 
    int shang=a/16;  //取商 
    char result[200];
    int count=0;

    while(shang!=0) //商大于等于0,也就是这个数比16大,17是‘11’(16进制)
    {
        switch(yu)
        {
            case 0: result[count]='0';break;
            case 1: result[count]='1';break;
            case 2: result[count]='2';break;
            case 3: result[count]='3';break;
            case 4: result[count]='4';break;
            case 5: result[count]='5';break;
            case 6: result[count]='6';break;
            case 7: result[count]='7';break;
            case 8: result[count]='8';break;
            case 9: result[count]='9';break;
            case 10: result[count]='A';break;
            case 11: result[count]='B';break;
            case 12: result[count]='C';break;
            case 13: result[count]='D';break;
            case 14: result[count]='E';break;
            case 15: result[count]='F';break;
        }
       
        count++;
        yu=shang%16;//余数
        shang=shang/16;
    }
    

    if(shang==0) 
    {
        switch(yu)
        {
            case 0: result[count]='0';break;
            case 1: result[count]='1';break;
            case 2: result[count]='2';break;
            case 3: result[count]='3';break;
            case 4: result[count]='4';break;
            case 5: result[count]='5';break;
            case 6: result[count]='6';break;
            case 7: result[count]='7';break;
            case 8: result[count]='8';break;
            case 9: result[count]='9';break;
            case 10: result[count]='A';break;
            case 11: result[count]='B';break;
            case 12: result[count]='C';break;
            case 13: result[count]='D';break;
            case 14: result[count]='E';break;
            case 15: result[count]='F';break;
        }
    }

    for(int i=count;i>=0;i--)
    {
        cout<<result[i];
    }
}

6.特殊回文数

123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
	cin>>n;
	//5位
	for(int a=1; a<=9;a++){
		for(int b=0; b<=9; b++){
			for(int c=0; c<=9; c++){
				if(a+b+c+b+a==n){
					cout<<a<<b<<c<<b<<a<<endl;
				} 									
			}
		}
	}
	//6位 
	for(int a=1; a<=9;a++){
		for(int b=0; b<=9; b++){
			for(int c=0; c<=9; c++){
				if(a+b+c+c+b+a==n){
					cout<<a<<b<<c<<c<<b<<a<<endl;
				} 									
			}
		}
	}
	return 0;
}

7.回文数

1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。

#include <bits/stdc++.h>
using namespace std;
int main()
{   
	for(int a=1; a<=9;a++){
		for(int b=0; b<=9; b++){
			if(a*1000+b*100+b*10+a<=9999){
				cout<<a<<b<<b<<a<<endl; 									
			}
		}
	}
	
	return 0;
}

8.特殊的数字

 153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。

#include <bits/stdc++.h>
using namespace std;
int main()
{   
	for(int a=1; a<=9;a++){
		for(int b=0; b<=9; b++){
			for(int c=0; c<=9; c++){
				if(a*100+b*10+c==a*a*a+b*b*b+c*c*c){
					cout<<a*100+b*10+c<<endl;
				}
			}
		}
	}
	
	return 0;
}

9.杨辉三角形

杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。

它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。

下面给出了杨辉三角形的前4行:  

   1 

  1 1 

 1 2 1 

1 3 3 1

给出n,输出它的前n行。

#include <bits/stdc++.h>
using namespace std;
int main()
{   
	int n;
	cin>>n;
	int lst[n][n+2];
	memset(lst, 0 ,sizeof lst); //memset的作用一般就是用来初始化数组例如用来将a数组全部归零
	lst[0][1]=1;
	
	for(int i=1; i<n; i++){
		for(int j=1; j<n+1; j++){
			lst[i][j]=lst[i-1][j]+lst[i-1][j-1]; 
		}
	}
	
	for(int  i=0; i<n; i++){
		for(int j=1; j<=i+1; j++){
			cout<<lst[i][j]<<" ";
		}
		cout<<endl;
	}
	
	return 0;
}

10.查找整数

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

#include <bits/stdc++.h>
using namespace std;
int main()
{   
	int n;
	cin>>n;
	int num[n];
	for(int i=0; i<n; i++){
		cin>>num[i];
	}
	int a;
	cin>>a;
	for(int i=0; i<n; i++){
		if(num[i]==a){
			cout<<i+1<<endl;
			break;
		}else if((num[i]!=a) && (i==n-1)){
			cout<<"-1"<<endl;
		}
	}
	
	
	return 0;
}

11.数列特征

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

sort函数的使用!

#include <bits/stdc++.h>
using namespace std;
int main()
{   
	int n;
	cin>>n;
	int num[n];
	for(int i=0; i<n; i++){
		cin>>num[i];
	}
	sort(num, num+n, greater<int>());
	cout<<num[0]<<endl;
	cout<<num[n-1]<<endl;
	int sum=0;
	for(int i=0; i<n; i++){
		sum=sum+num[i];
	}
	cout<<sum<<endl;
	
	
	return 0;
}

12.字母图形

利用字母可以组成一些美丽的图形,下面给出了一个例子:

ABCDEFG

BABCDEF

CBABCDE

DCBABCD

EDCBABC

这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。

#include <bits/stdc++.h>
using namespace std;
int main()
{   
	int n,m;
	cin>>n>>m;
	string str1="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	
	for(int i=0; i<n; i++){
		string res="";
		//第一部分
		for(int j=i; j>i-m; j--) {
			if(j<0) break;
			res+=str1[j];
		}
		//第二部分
		for(int k=1; k<m-i;k++){
			res+=str1[k];
		}
		cout<<res<<endl;	 
	}
	return 0;

}

13.01字串

对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:

00000

00001

00010

00011

00100

请按从小到大的顺序输出这32种01串。

可能有所复杂,实际就是转二进制再补0!

#include <bits/stdc++.h>
using namespace std;
void transform_to_2(int x){
	int yushu=x%2; //余数
	int shang=x/2; //商
	char result[32];
	int count=0;
	
	while(shang!=0){
		switch(yushu){
			case 0: result[count]='0'; break;
			case 1: result[count]='1'; break;
		}
		count++;
		yushu=shang%2;
		shang=shang/2;
	} 
	
	if(shang==0){
		switch(yushu){
			case 0: result[count]='0'; break;
			case 1: result[count]='1'; break;
		}
	} 

	int n=count;
		if(n==0)  cout<<"0000";
		if(n==1)  cout<<"000";
		else if(n==2)  cout<<"00";
		else if(n==3)  cout<<"0";

		
	for(int i=count; i>=0; i--)
	{
		
		cout<<result[i];
	}
	
}
int main()
{   
	for(int i=0; i<32; i++){
		transform_to_2(i);
		 cout<<endl;
	}
	return 0;

}

14.闰年判断

闰年口诀:四年一闰·,百年不闰,四百年又闰!

#include <bits/stdc++.h>
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;

}

15.Fibonacci数列

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

分别求余,相加再求余!

#include <bits/stdc++.h>
using namespace std;

int main()
{   
	long long n;
	cin>>n;
	long long a[n];
	a[0]=1;
	a[1]=1;
	for(int i=2; i<n; i++){
		a[i]=a[i-1]%10007+a[i-2]%10007;
//		a[i]=a[i]%10007;
//		cout<<a[i]<<endl;
	}

	cout<< a[n-1]%10007 <<endl;
	return 0;

}

16.圆的面积

给定圆的半径r,求圆的面积。

PI的表示方式!可以用计算器辅助!

#include <bits/stdc++.h>
using namespace std;
//const double PI=3.14159265358979323846;  //要取更精确的值,否则数据大时计算结果有误
int main()
{   
	int r;
	cin>>r;
	double PI=atan(1.0)*4;
	double s=PI*r*r;
	cout << fixed << setprecision(7);
	cout<<s;
//	printf("%.7f", s);
	return 0;

}

17.序列求和

求1+2+3+...+n的值。

  • (首项+末项)*项数/2
#include <bits/stdc++.h>
using namespace std;
int main()
{   
	long long n;
	cin>>n;
	long long sum=0;
	sum = (1+n)*n/2;
	cout<<sum;
	return 0;

}

18.阶乘计算

C++蓝桥杯 基础练习之阶乘计算

19.高精度加法

C++蓝桥杯 基础练习之高精度加法

补充:

  • int x=(a[alen-1-i])-'0';
  • a[alen-1-i]表示从数组a的最后一个元素开始,向前数第i个元素。
  • (a[alen-1-i])-'0'表示将数组a中的字符型数字转换成整型数字。这是因为在计算机中,字符型数字的存储是按照ASCII码来存储的,'0'的ASCII码是48,因此将字符型数字减去'0'的ASCII码,就可以得到对应的整型数字。

20.Huffuman树

 C++蓝桥杯 基础练习之Huffuman树

21.2n皇后问题

C++蓝桥杯 基础练习之2n皇后

22.报时助手

C++蓝桥杯 基础练习之报时助手

23.回形取数

C++蓝桥杯 基础练习之回形取数

24.龟兔赛跑预测

C++蓝桥杯 基础练习之龟兔赛跑预测

25.芯片测试

C++蓝桥杯 基础练习之芯片的测试

26.FJ的字符串

C++蓝桥杯 基础练习之FJ字符串

27.Sine之舞

C++蓝桥杯 基础练习之Sine之舞

28.数的读法

C++蓝桥杯 基础练习之Sine之舞

29.完美的代价

C++蓝桥杯 基础练习之完美代价

30.矩形面积交

C++蓝桥杯 基础练习之矩形面积交

31.矩阵乘法

C++蓝桥杯 基础练习之矩阵相乘

32.分解质因数

C++蓝桥杯 基础练习之分解质因数

33.字符串对比

C++蓝桥杯 基础练习之字符串对比

34.时间转换 

C++蓝桥杯 基础练习之时间转换 

猜你喜欢

转载自blog.csdn.net/MengYa_Dream/article/details/129541278
今日推荐