蓝桥杯练习题库 2基础练习题含参考代码分析.docx
《蓝桥杯练习题库 2基础练习题含参考代码分析.docx》由会员分享,可在线阅读,更多相关《蓝桥杯练习题库 2基础练习题含参考代码分析.docx(33页珍藏版)》请在冰豆网上搜索。
蓝桥杯练习题库2基础练习题含参考代码分析
基础练习数列排序
时间限制:
1.0s 内存限制:
512.0MB
问题描述
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。
1<=n<=200
输入格式
第一行为一个整数n。
第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
输出格式
输出一行,按从小到大的顺序输出排序后的数列。
样例输入
5
83649
样例输出
34689
锦囊1
使用排序算法。
锦囊2
可以使用冒泡排序、排入排序等,也可以使用快速排序等更快的,还可以直接调用系统的函数。
#include
#include
voidPrint(int*data,intn)
{
inti;
for(i=0;i{
printf("%d",data[i]);
}
printf("\n");
}
intSplit(int*data,intpre,intrear)
{
intvalue=data[pre];
while(pre{
while(data[rear]>=value&&predata[pre]=data[rear];
while(data[pre]data[rear]=data[pre];
}
data[pre]=value;
returnpre;
}
//快速排序
voidQuickSort(int*data,intpre,intrear)
{
if(pre{
intmid=Split(data,pre,rear);
QuickSort(data,pre,mid-1);
QuickSort(data,mid+1,rear);
}
}
intmain()
{
inti;
intn;
int*data;
scanf("%d",&n);
data=(int*)malloc(sizeof(int)*n);
for(i=0;i{
scanf("%d",&data[i]);
}
QuickSort(data,0,n-1);
Print(data,n);
return0;
}
基础练习十六进制转八进制
时间限制:
1.0s 内存限制:
512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n(1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
锦囊1
使用二进制。
锦囊2
先把十六进制转成二进制,每位十六进制正好转成4位二进制,然后再将二进制转成八进制,每三个二进制转成一个八进制。
#include
#include
#include
#defineMaxSize100000
voidsaveB(char*b,charc3,charc2,charc1,charc0,intstart)
{
b[start]=c3;
b[start+1]=c2;
b[start+2]=c1;
b[start+3]=c0;
}
inthtob(char*h,char*b)
{
inti,j;
inthl=strlen(h);
for(i=0;iswitch(h[i])
{
case'0':
{
saveB(b,'0','0','0','0',4*i);
break;
}
case'1':
{
saveB(b,'0','0','0','1',4*i);
break;
}
case'2':
{
saveB(b,'0','0','1','0',4*i);
break;
}
case'3':
{
saveB(b,'0','0','1','1',4*i);
break;
}
case'4':
{
saveB(b,'0','1','0','0',4*i);
break;
}
case'5':
{
saveB(b,'0','1','0','1',4*i);
break;
}
case'6':
{
saveB(b,'0','1','1','0',4*i);
break;
}
case'7':
{
saveB(b,'0','1','1','1',4*i);
break;
}
case'8':
{
saveB(b,'1','0','0','0',4*i);
break;
}
case'9':
{
saveB(b,'1','0','0','1',4*i);
break;
}
case'A':
{
saveB(b,'1','0','1','0',4*i);
break;
}
case'B':
{
saveB(b,'1','0','1','1',4*i);
break;
}
case'C':
{
saveB(b,'1','1','0','0',4*i);
break;
}
case'D':
{
saveB(b,'1','1','0','1',4*i);
break;
}
case'E':
{
saveB(b,'1','1','1','0',4*i);
break;
}
case'F':
{
saveB(b,'1','1','1','1',4*i);
break;
}
}
return4*hl;
}
intbtoo(char*b,char*o,intbl)
{
inti,j;
intol;
intvalue;
if(bl%3==0)
ol=bl/3;
else
ol=bl/3+1;
j=bl-1;
for(i=ol-1;i>=0;i--)
{
if(i>0)
o[i]=b[j]-48+(b[j-1]-48)*2+(b[j-2]-48)*4+48;
else
{
switch(j)
{
case2:
o[i]=b[j]-48+(b[j-1]-48)*2+(b[j-2]-48)*4+48;
break;
case1:
o[i]=b[j]-48+(b[j-1]-48)*2+48;
break;
case0:
o[i]=b[j];
break;
}
}
j=j-3;
}
returnol;
}
voidprintO(char*o,intol)
{
inti=0;
if(o[0]=='0')
i=1;
for(;i
{
printf("%c",o[i]);
}
printf("\n");
}
main()
{
charh[MaxSize];
charb[4*MaxSize];
charo[4*MaxSize/3+1];
intn,i,bl,ol;
scanf("%d",&n);
getchar();
for(i=0;i{
gets(h);
bl=htob(h,b);
ol=btoo(b,o,bl);
printO(o,ol);
}
}
基础练习十六进制转十进制
时间限制:
1.0s 内存限制:
512.0MB
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:
十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
锦囊1
按16进制展开。
锦囊2
按数位依次操作,每次将前面的乘16,再加上当前数位的值。
本题的C参考代码如下:
#include
#include
#include
intmain()
{
doublesum=0,x;
chara[8];
intlen,i=0;
gets(a);
len=strlen(a);
while(len)
{
if(a[len-1]>='A'&&a[len-1]<='F')
x=(a[len-1]-'7')*pow(16,i++);
else
x=(a[len-1]-'0')*pow(16,i++);
sum+=x;
len--;
}
printf("%.0lf",sum);
return0;
}
基础练习十进制转十六进制
时间限制:
1.0s 内存限制:
512.0MB
问题描述
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。
它有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
输出格式
输出这个整数的16进制表示
样例输入
30
样例输出
1E
锦囊1
按除16取余倒数(也可使用格式输出)。
锦囊2
可以使用递归来处理,递归参数为要转换的数字,如果该数字大于等于16,则将递归处理该数整除16的值,然后再输出最后一位。
C/C++语言可以使用格式输出直接输出转换后的结果。
本题的C++参考代码如下:
1.#include
2.#include
3.using namespace std;
4.int main()
5.{
6. int n;
7. char s[100000];
8. while(cin>>n)
9. {
10. int k=0;
11. if(n==0)
12. {
13. cout<<0;
14. }
15. else
16. {
17. while(n!
=0)
18. {
19. if(n%16>=10)
20. {
21. s[k++]='A'+n%16-10;
22. }
23. else
24. {
25. s[k++]='0'+n%16;
26. }
27. n=n/16;
28. }
29. for(int i=k-1;i>=0;i--)
30. {
31. cout<
32. }
33. }
34. cout<35. }
36. return 0;
37.}
38.
本题的C参考代码如下:
#include
#include
chardata[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//输出
voidPrint(char*num,intn)
{
inti;
for(i=n-1;i>=0;i--)printf("%c",num[i]);
printf("\0");
printf("\n");
}
//将十六进制数转换为十进制数
intTransform(char*num,longlongvalue)
{
intn=0;
while(value>=16)
{
num[n++]=data[value%16];
value/=16;
}
num[n++]=data[value%16];
returnn;
}
intmain()
{
longlongvalue;
charnum[10];
intn;
scanf("%I64d",&value);
n=Transform(num,value);
Print(num,n);
return0;
}
基础练习特殊回文数
时间限制:
1.0s 内存限制:
512.0MB
问题描述
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n,编程求所有这样的五位和六位十进制数,满足各位数字之和等于n。
输入格式
输入一行,包含一个正整数n。
输出格式
按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
1<=n<=54。
锦囊1
枚举加判断。
锦囊2
枚举所有的五位和六位整数,先判断它们是否为回文数,然后再计算所有数字和,判断是否为n。
本题的C参考代码如下:
#include
intmain()
{
inta,b,c,d,e,f,t,all;
scanf("%d",&t);
for(a=1;a<10;a++)
for(b=0;b<10;b++)
for(c=0;c<10;c++)
for(d=0;d<10;d++)
for(e=0;e<10;e++)
{
if(a==e)
if(b==d)
{
all=a+b+c+d+e;
if(all==t)
printf("%d\n",a*10000+b*1000+c*100+d*10+e);
}
}
for(a=1;a<10;a++)
for(b=0;b<10;b++)
for(c=0;c<10;c++)
for(d=0;d<10;d++)
for(e=0;e<10;e++)
for(f=0;f<10;f++)
{
if(a==f)
if(b==e)
if(c==d)
{
all=a+b+c+d+e+f;
if(all==t)
printf("%d\n",a*100000+b*10000+c*1000+d*100+e*10+f);
}
}
return0;
}
基础练习回文数
时间限制:
1.0s 内存限制:
512.0MB
问题描述
1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
输出格式
按从小到大的顺序输出满足条件的四位十进制数。
锦囊1
枚举加判断。
锦囊2
枚举所有的四位整数,将它们的三位分别分离出来,然后判断是否第一位与第四位相同且第二位和第三位相同。
本题的C++参考代码如下:
1.#include
2.int main()
3.{
4. for(int i1=1;i1<10;i1++)
5. {
6. for(int i2=0;i2<10;i2++)
7. {
8. for(int i3=0;i3<10;i3++)
9. {
10. for(int i4=0;i4<10;i4++)
11. {
12. if(i1==i4 && i2==i3)
13. printf("%d%d%d%d\n",i1,i2,i3,i4);
14. }
15.
16. }
17. }
18. }
19. return 0;
20.}
本题的C参考代码如下:
#include
intmain()
{
inta,b,c,d,i;
for(i=1000;i<=9999;i++)
{
a=i/1000;
b=i/100%10;
c=i/10%10;
d=i%10;
if(a==d&&b==c)
printf("%d\n",i);
}
return0;
}
基础练习特殊的数字
时间限制:
1.0s 内存限制:
512.0MB
问题描述
153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。
编程求所有满足这种条件的三位十进制数。
输出格式
按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。
#include
intmain()
{
inti,j,k,n;
for(n=100;n<1000;n++)
{
i=n/100;
j=n/10%10;
k=n%10;
if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)
printf("%d\n",n);
}
return0;
}
基础练习杨辉三角形
时间限制:
1.0s 内存限制:
256.0MB
问题描述
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:
三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
11
121
1331
给出n,输出它的前n行。
输入格式
输入包含一个数n。
输出格式
输出杨辉三角形的前n行。
每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。
请不要在前面输出多余的空格。
样例输入
4
样例输出
1
11
121
1331
数据规模与约定
1<=n<=34。
锦囊1
使用二维数组。
锦囊2
使用一个二维数组来保存杨辉三角形,先将三角形计算出来,然后再输出。
本题的C++参考代码如下:
1.#include
2.using namespace std;
3.const int MAXN = 40;
4.int n;
5.int a[MAXN][MAXN];
6.int main()
7.{
8. cin >> n;
9. a[0][0] = 1;
10. for (int i = 0; i < n; ++i)
11. {
12. a[i][0] = a[i][i] = 1;
13. for (int j = 1; j < i; ++j)
14. a[i][j] = a[i-1][j-1] + a[i-1][j];
15. }
16. for (int i = 0; i < n; ++i)
17. {
18. for (int j = 0; j <= i; ++j)
19. cout << a[i][j] << " ";
20. cout << endl;
21. }
22. return 0;
23.}
本题的C参考代码如下:
#include
#defineMAXN40
intn;
inta[MAXN][MAXN];
intmain()
{
inti,j;
scanf("%d",&n);
a[0][0]=1;
for(i=0;i{
a[i][0]=a[i][i]=1;
for(j=1;j
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
for(i=0;i{
for(j=0;j<=i;++j)
printf("%d",a[i][j]);
printf("\n");
}
return0;
}
基础练习查找整数
时间限制:
1.0s 内存限制:
256