蓝桥杯练习系统基础练习(非VIP试题)

前言

  • 环境:Dev-C++
  • 万能头文件: #include<bits/stdc++.h>
  • 水平不高,单纯记录寒假生活。

基础练习

BASIC-01 A+B问题

解题思路

  • 有手就行

AC代码

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

BASIC-02 序列求和

解题思路

  • 利用等差数列公式求和
  • 注意数据范围

AC代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long n;
	cin>>n;
	cout<<(1+n)*n/2;
	return 0;
}

BASIC-03 圆的面积

解题思路

  • 使用圆的面积公式
  • PI需要定义,这里使用的是acos(-1.0)
  • 注意输出格式

AC代码

#include<bits/stdc++.h>
#define PI acos(-1.0)
using namespace std;
int main() 
{
	int r;
	cin>>r;
	double s=r*r*PI;
	printf("%.7lf",s);
	return 0;
}

BASIC-04 Fibonacci数列

解题思路

  • 不需要求出结果再取模,直接进行取模
  • 直接递归时间会超限

AC代码

#include<bits/stdc++.h>
using namespace std;
long long a[1000050];
int main( )
{
	int n;
	cin>>n;
	a[1]=a[2]=1;
	for(int i=3;i<=n;i++)
	{
		a[i]=(a[i-1]+a[i-2])%10007;	
	}
	cout<<a[n];
}

BASIC-1 闰年判断

解题思路

  • 了解闰年的特征
  • 简单的判断语句

AC代码

#include<bits/stdc++.h>
using namespace std;
int main( )
{
	int y;
	cin>>y;
	if((y%4==0&&y%100!=0)||y%400==0)
	      cout<<"yes";
	else
	      cout<<"no";
	return 0;
}

BASIC-2 01字串

解题思路

  • 我的方法是0-31一共32个数,想办法用二进制表示。
  • 这题无脑暴力输出也能过(狗看了都摇头)

AC代码

#include<bits/stdc++.h>
using namespace std;
int main( )
{
	for(int i=0;i<=31;i++)
	{
		int j=i;
		cout<<j/16;      //第一位表示有几个16
		j%=16;           
		cout<<j/8;       //对16取模后有几个8
		j%=8;
		cout<<j/4;       //对8取模后有几个4
		j%=4;
		cout<<j/2;       //对4取模后有几个2
		j%=2;
		cout<<j;         //对2取模有几个1(即本身)
		cout<<endl;
	}
	return 0;
}

BASIC-3 字母图形

解题思路

  • 先将对角线全赋值为A,再向左向右进行赋值

AC代码

#include<bits/stdc++.h>
using namespace std;
char a[27][27];
int main( )
{
	int n,m;
	cin>>n>>m;
	for(int i=0;i<26;i++)                     //输入完整的表
	{
		a[i][i]='A';
		
		for(int j=0;j<26-i;j++)
			a[i][i+j]='A'+j;
			
		for(int k=0;k<=i;k++)
			a[i][i-k]='A'+k;

	}
	for(int i=0;i<n;i++)                      //输出n行m列
	{
		for(int j=0;j<m;j++)
		{
			cout<<a[i][j];
		}	
		cout<<endl;
	}
	return 0;
}

BASIC-4 数列特征

解题思路

  • 先把数存进数组
  • 简单的最大最小值比较再赋值还有sum求和,注意maxm的初值要设的小于-10000

AC代码

#include<bits/stdc++.h>
using namespace std;
int a[10050];
int main( )
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}	
	int maxm=-10010;
	int minm=10010;
	int sum=0;
	for(int i=0;i<n;i++)
	{
		if(maxm<=a[i])
			maxm=a[i];
		if(minm>=a[i])
			minm=a[i];
		sum+=a[i];		
	}
	cout<<maxm<<endl<<minm<<endl<<sum;
	return 0;
}

BASIC-5 查找整数

解题思路

  • 简单的遍历然后判断输出,注意下标得加1

AC代码

#include<bits/stdc++.h>
using namespace std;
int a[1050];
int main( )
{
	int n,m;	
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>a[i];
	cin>>m;
	for(int i=0;i<n;i++)
	{
		if(a[i]==m)
		{
			cout<<i+1;   //下标加一代表是第几个数,因为下标从0开始
			return 0;
		}	
	}	
	cout<<-1;
	return 0;
}

BASIC-6 杨辉三角形

解题思路

  • 简单的杨辉三角,方法看注释

AC代码

#include<bits/stdc++.h>
using namespace std;
int a[34][34];
int main( )
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		a[i][i]=1;        //左对角线全赋为1
		a[i][0]=1;        //第一列全赋为1
	}
	for(int i=2;i<n;i++)
	{
		for(int j=1;j<i+1;j++)
			a[i][j]=a[i-1][j-1]+a[i-1][j];//从a[2][1]开始遍历赋值,每个等于肩上的两数之和
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<i+1;j++)    //这边的输出方法有点小讲究,我也不知道每行后面多个空格会不会错,但是这样写肯定没错
		{
			if(j==0)
				cout<<a[i][j];
			else
				cout<<' '<<a[i][j];
		}
		cout<<endl;	
	}
	return 0;
}

BASIC-7 特殊的数字

解题思路

  • 通过剥离每位数字再三次方相加判断是否和原数相等

AC代码

#include<bits/stdc++.h>
using namespace std;
int main( )
{
	for(int i=100;i<=999;i++)
	{
		int n,a,sum=0;
		n=i;
		while(n)
		{
			a=n%10;        //第一次循环a是个位的数字,第二次循环是十位的数字,第三次是百位的数字
			n/=10;        
			sum+=pow(a,3);
		}	
		if(sum==i)
			cout<<i<<endl;
		
	}
	return 0;
}

BASIC-8 回文数

解题思路

  • 一样通过剥离法,将每一位剥下来再乘10相加进行判断

AC代码

#include<bits/stdc++.h>
using namespace std;
int main( )
{
	for(int i=1000;i<10000;i++)
	{
		int n,a,sum=0;
		n=i;
		while(n)
		{
			a=n%10;
			n/=10;
			sum*=10;
			sum+=a;
			
		}
		if(i==sum)
			cout<<i<<endl;
	}
	return 0;
}

BASIC-9 特殊回文数

解题思路

  • 与上题类似,但还需要将剥离下来的数字进行相加求和,需要两个判断同时为true

AC代码

#include<bits/stdc++.h>
using namespace std;
int main( )
{
	int m;
	cin>>m;
	for(int i=10000;i<1000000;i++)
	{
		int n,a,sum1=0,sum2=0;
		n=i;
		while(n)
		{
			a=n%10;          //剥离个位
			n/=10;           //自身除10
			sum1*=10;        
			sum1+=a;          //sum1求翻转的数字
			sum2+=a;          //sum2求各位上数字之和
		}	
		if(sum1==i && sum2==m)
			cout<<i<<endl;
		
	}
	return 0;
}

BASIC-10 十进制转十六进制

解题思路

  • 掌握进制转换原理

AC代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int k, n;
	int a[100];
	cin>>n;
	k = 0;
	while (n >=16)//这个循环将十进制的每一位倒序存入数组
	{
		a[k] = n % 16;
		k++;
		n = n / 16;
	}
	a[k] = n % 16;
	for (k; k>=0; k--)//转为十六进制再倒序输出
	{
	    if (a[k] < 10)
			printf("%d", a[k]);
		else
			printf("%c", 'A' + a[k] - 10);
	}
	return 0;
}

BASIC-11 十六进制转十进制

解题思路

  • 以FFFF为例,第一次sum为15,第二次为1516+15,第三次为(1516+15)16+15,第四次为((1516+15)16+15)16+15,即15163+15162+15161+15160
#include<bits/stdc++.h>
int main()
{
	int i, l;
	long long sum;
	char a[100];
	sum = 0;
	gets(a);
	for (i=0; a[i];i++)
	{
		if (a[i] <='9')
			a[i] = a[i] - '0';

		else if(a[i]<='F')
			a[i] = a[i] - 'A' + 10;
		else
			a[i] = a[i] - 'a' + 10;
	}
	l = strlen(a);
	for (i = 0; a[i]; i++)
		sum = sum + a[i] * pow(16, l - i - 1);
	printf("%lld", sum);
	return 0;
}

BASIC-12 十六进制转八进制

解题思路

  • 先把十六进制转换为二进制,再转换为八进制
  • 十六进制的一位对应二进制的四位,直接转换成字符串
  • 二进制转换成八进制时,三位转换成八进制一位,所以提前在前面补足0
  • 然后把八进制的字符串从第一个不为‘0 ’处开始输出就可以了
#include<bits/stdc++.h>
using namespace std;
string _16_2_(string str)
{
	string a="";
	for(int i=0;i<str.size();i++)
	{
		switch(str[i])          //将十六进制转为四位四位的二进制
		{
			case '0': a+= "0000"; break;
			case '1': a+= "0001"; break;
			case '2': a+= "0010"; break;
			case '3': a+= "0011"; break;
			case '4': a+= "0100"; break;
			case '5': a+= "0101"; break;
			case '6': a+= "0110"; break;
			case '7': a+= "0111"; break;
			case '8': a+= "1000"; break;
			case '9': a+= "1001"; break;
			case 'A': a+= "1010"; break;
			case 'B': a+= "1011"; break;
			case 'C': a+= "1100"; break;
			case 'D': a+= "1101"; break;
			case 'E': a+= "1110"; break;
			case 'F': a+= "1111"; break;
			default: break;	
		}
	}
	return a;
}
string _2_8(string str)        //再将二进制转为八进制,注意要进行补0,将二进制补为3的整数倍
{
	string a;
	switch(str.size()%3)
	{
		case 0:break;
		case 1:str="00"+str;break;
		case 2:str="0"+str;break;
		default:break;
	}
	for(int i=0;i<str.size();i+=3)
	{
		int m=(str[i]-'0')*4+(str[i+1]-'0')*2+(str[i+2]-'0');
		a+=(m+'0');
	}
	return a;
} 


int main( )
{
	int n;
	cin>>n;
	string s;
	while(n--)
	{
		cin>>s;
		string a=_16_2_(s);			//先转为二进制
		string b=_2_8(a); 			//再转为八进制
		int k=b.size();
		int p=0;  
		while(b[p]=='0') p++;                  //题目中要求输出时前面不需要带0所以从不是0的时候开始
		for(int i=p;i<k;i++) cout<<b[i];
		if(n>=1)      cout<<endl;              //这一行必不可少,少输出换行就是错的的
	}     
	return 0;
}

至此蓝桥杯基础练习非VIP部分习题已经完毕

posted @ 2022-01-10 14:18  慎独_y  阅读(123)  评论(0)    收藏  举报