蓝桥杯练习系统基础练习(非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部分习题已经完毕
本文来自博客园,作者:慎独_y,转载请注明原文链接:https://www.cnblogs.com/yyh001/p/15781945.html

浙公网安备 33010602011771号