蓝桥杯-基础练习

蓝桥杯 基础练习

01字串

对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。

- 最简单:直接输出相应字符
- 本题可以理解为0~32的二进制数的输出
#include<iostream>
using namespace std;

int main(){
	int i,j;
	string str="00000";
	for(i=0;i<32;++i){
		cout<< str<<endl;
		str[4]+=1;
		for(j=4;j>=0;--j){
			if(str[j]=='2'){
			str[j-1]+=1;
			str[j]='0';
			}
		}
	}
	return 0;
}   

字母图形

问题描述
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。

  • 锦囊1
    字母的序号与两个坐标的差的绝对值有关。
#include<iostream>
#include<cmath>
using namespace std;

int main(){
	int m,n;
	cin>> n>>m;
	int i,j;

	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			//cout<<abs(i-j);
			cout<<(char)('A'+abs(i-j));
		}
		cout<<'\n';
	}

	return 0;
}

cout前进行类型转换(char)
引入<math.h>//<stdlib.h>

杨辉三角形

问题描述
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
1 1  
1 2 1
1 3 3 1
给出n,输出它的前n行。

二维数组置为0,需要引入<string.h>
memset(a,0,sizeof(a));

#include<iostream>
#include<string.h>
using namespace std;

int main(){
	const unsigned short MAX=35;
	int a[MAX][MAX];
	memset(a,0,sizeof(a));
	int n;
	cin >> n;
	a[0][n-1]=1;
	for(int i=1;i<n;i++){
		for(int j=n-1;j>=0;j--){
			a[i][j]=a[i-1][j]+a[i-1][j+1];
		}
	}
	
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(a[i][j]!=0){
				cout<<a[i][j]<<'\0';
			}
			
		}
		cout<<'\n';
	}
}

特殊回文数

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

x%10从后往前对每位数字进行提取

#include<iostream>
using namespace std;

int main(){
	int n;
	cin>>n;
	int a,b,c,d,e,f,x;
	for(x=10000;x<100000;x++){		
		a=x%10;
		b=x/10%10;
		c=x/100%10;
		d=x/1000%10;
		e=x/10000;
		if(x==a*10000+b*1000+c*100+d*10+e){
			if(a+b+c+d+e==n)
				cout <<x<<'\n';
		}
	}
	for(x=100000;x<1000000;x++){		
		a=x%10;
		b=x/10%10;
		c=x/100%10;
		d=x/1000%10;
		e=x/10000%10;
		f=x/100000;
		if(x==a*100000+b*10000+c*1000+d*100+e*10+f){
			if(a+b+c+d+e+f==n)
				cout <<x<<'\n';
		}
	}

}

十进制转十六进制

问题描述
  十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有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

  • i++:先进行表达式运算,再进行自增运算。
    x = i ++; //先让x变成i的值1,再让i加1

  • ++i:先进行自增或者自减运算,再进行表达式运算。
    x = ++i; //先让i加1, 再让x变成i的值1

#include<iostream>
using namespace std;

int main(){
	int a,num[100];
	cin>>a;
	char hex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
	int i=0,m;
	if(a==0){
		cout<<'0';
	}
	while(a>0){
		num[i++]=a%16;
		a=a/16;
	}
	for(i=i-1;i>=0;i--){
		m=num[i];
		cout<<hex[m];
	}
	return 0;
}

十六进制转八进制

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

输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

  • 十六进制先转化为4个一组的2进制,将2进制三个一组,不足前面补0,转为8进制
  • 每次for循环开始重新申明要定义的字符串
  • s.substr(0,5)//获得字符串s中从第0位开始的长度为5的字符串
#include<iostream>
using namespace std;

string trans8(char s){
	switch(s){
		case '0':return "0000";
		case '1':return "0001";
		case '2':return "0010";
		case '3':return "0011";
		case '4':return "0100";
		case '5':return "0101";
		case '6':return "0110";
		case '7':return "0111";
		case '8':return "1000";
		case '9':return "1001";
		case 'A':return "1010";
		case 'B':return "1011";
		case 'C':return "1100";
		case 'D':return "1101";
		case 'E':return "1110";
		case 'F':return "1111";
	}
}
int main(){
	int n;
	cin>>n;
	string a[n];
	for(int i=0;i<n;i++){
		cin>>a[i];
	} 
	for(int i=0;i<n;i++){
		string eight;
		string two;
		char eig;//循环开始重新定义 
		for(int j=0;j<a[i].length();j++){
			two+=trans8(a[i][j]);//二进制相加  二维数组? 
		} 
		int m;
		m=two.length()%3;
		if(m==1){
			two.insert(0,"00");//三位一组,不足补0 
		}
		else if(m==2){
			two.insert(0,"0");
		}
		
		if(!(two[0]=='0'&&two[1]=='0'&&two[2]=='0')){
			eig=(two[0]-'0')*4+(two[1]-'0')*2+(two[2]);//4 2 1
			eight+=eig;		
		}
		for(int k=3;k<two.length();k+=3){//每次移动三位
			if(two.substr(k,3)=="000") eight+="0";
			else if(two.substr(k,3)=="001") eight+="1";
			else if(two.substr(k,3)=="010") eight+="2";
			else if(two.substr(k,3)=="011") eight+="3";
			else if(two.substr(k,3)=="100") eight+="4";
			else if(two.substr(k,3)=="101") eight+="5";
			else if(two.substr(k,3)=="110") eight+="6";
			else if(two.substr(k,3)=="111") eight+="7";
		}	 
		cout<<eight<<endl;
	}
	
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值