蓝桥杯 基础练习
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;
}