蓝桥杯C组试题及答案讲解Word格式文档下载.docx
《蓝桥杯C组试题及答案讲解Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《蓝桥杯C组试题及答案讲解Word格式文档下载.docx(46页珍藏版)》请在冰点文库上搜索。
我年龄的4次方是个6位数。
这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。
”
请你推算一下,他当时到底有多年轻。
通过浏览器,直接提交他那时的年龄数字。
不要提交解答过程,或其它的说明文字。
18
4.标题:
幻方填空
幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。
欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。
他把1,2,3,...16这16个数字填写在4x4的方格中。
如图p1.jpg所示,即:
16?
?
13
?
11?
9?
*
15?
1
表中有些数字已经显露出来,还有些用?
和*代替。
请你计算出?
和*所代表的数字。
并把*所代表的数字作为本题答案提交。
12
5.题目标题:
公约数公倍数
我们经常会用到求两个整数的最大公约数和最小公倍数的功能。
下面的程序给出了一种算法。
函数myfunc接受两个正整数a,b
经过运算后打印出它们的最大公约数和最小公倍数。
此时,调用myfunc(15,20)
将会输出:
3
60
//交换数值
voidswap(int*a,int*b)
{
inttemp;
temp=*a;
*a=*b;
*b=temp;
}
voidmyfunc(inta,intb)
intm,n,r;
if(a
m=a;
n=b;
r=a%b;
while(r!
=0)
a=b;
b=r;
r=a%b;
printf("
%d\n"
b);
//最大公约数
____________________________________);
//最小公倍数
请分析代码逻辑,并推测划线处的代码,通过网页提交。
m*n/b
6.标题:
三部排序
一般的排序有许多经典算法,如快速排序、希尔排序等。
但实际应用时,经常会或多或少有一些特殊的要求。
我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。
比如,对一个整型数组中的数字进行分类排序:
使得负数都靠左端,正数都靠右端,0在中部。
注意问题的特点是:
负数区域和正数区域内并不要求有序。
可以利用这个特点通过1次线性扫描就结束战斗!
以下的程序实现了该目标。
其中x指向待排序的整型数组,len是数组的长度。
voidsort3p(int*x,intlen)
intp=0;
intleft=0;
intright=len-1;
while(p<
=right){
if(x[p]<
0){
intt=x[left];
x[left]=x[p];
x[p]=t;
left++;
p++;
elseif(x[p]>
intt=x[right];
x[right]=x[p];
right--;
else{
__________________________;
//填空位置
如果给定数组:
25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0
则排序后为:
-3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25
请分析代码逻辑,并推测划线处的代码,通过网页提交
p++
7.标题:
核桃的数量
小张是软件项目经理,他带领3个开发组。
工期紧,今天都在加班呢。
为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。
他的要求是:
1.各组的核桃数量必须相同
2.各组内必须能平分核桃(当然是不能打碎的)
3.尽量提供满足1,2条件的最小数量(节约闹革命嘛)
程序从标准输入读入:
abc
a,b,c都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c<
30)
程序输出:
一个正整数,表示每袋核桃的数量。
例如:
用户输入:
245
20
再例如:
311
#include
voidswap(int*a,int*b)
temp=*a;
*a=*b;
*b=temp;
intf(inta,intb)
intm,n,r;
if(a
m=a,n=b,r=a%b;
while(r!
=0)
a=b;
b=r;
r=a%b;
returnm*n/b;
intmain()
inta,b,c;
scanf("
%d%d%d"
&
a,&
b,&
c);
%d"
f(f(a,b),f(b,c)));
return0;
8.题目标题:
打印十字图
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)
$$$$$$$$$$$$$
$$
$$$$$$$$$$$$$$$
$$$$
$$$$$$$$$$$$$
$$$$$$
$$$$$$$$$$$
$$$$$$$
$$$$$$$$$$$
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。
输入格式:
一个正整数n(n<
30)表示要求打印图形的层数
输出:
对应包围层数的该标志。
1
程序应该输出:
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
请仔细观察样例,尤其要注意句点的数量和输出位置。
intgo(inti,intj,intn)
if(i>
n*2+3)
i=n*4+6-i;
if(j>
j=n*4+6-j;
if(i<
j)swap(&
i,&
j);
=2&
&
j<
=2)return0;
if(i%2==1&
j>
=i-2)return1;
if(j%2==1&
j!
=i-1)return1;
intn;
n);
inti,j;
for(i=1;
i<
=n*4+5;
i++)
for(j=1;
j++)
if(go(i,j,n))
$"
);
else
."
\n"
9.标题:
带分数
100可以表示为带分数的形式:
100=3+69258/714
还可以表示为:
100=82+3546/197
注意特征:
带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100有11种表示法。
题目要求:
从标准输入读入一个正整数N(N<
1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
不要求输出每个表示,只统计有多少表示法!
100
11
105
6
#defineN9
intnum[N]={1,2,3,4,5,6,7,8,9};
inttag[3][3]={{4,3,2},{5,3,1},{6,2,1}};
intgo(inti,intn)
intcount=0;
for(a=0;
a<
3;
a++)
intr[3]={0},d=0;
for(b=0;
b<
b++)
for(c=0;
c<
tag[a][b];
c++)
r[b]=r[b]*10+num[d++];
if(r[0]+r[1]/r[2]==n&
r[1]%r[2]==0)count++;
if(r[0]+r[2]/r[1]==n&
r[2]%r[1]==0)count++;
if(r[1]+r[0]/r[2]==n&
r[0]%r[2]==0)count++;
if(r[1]+r[2]/r[0]==n&
r[2]%r[0]==0)count++;
if(r[2]+r[0]/r[1]==n&
r[0]%r[1]==0)count++;
if(r[2]+r[1]/r[0]==n&
r[1]%r[0]==0)count++;
while(i<
N)
intk=i+1;
while(k<
swap(num+i,num+k);
count+=go(i+1,n);
k++;
i++;
returncount;
go(0,n));
10.标题:
剪格子
如图p1.jpg所示,3x3的格子中填写了一些整数。
我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60。
本题的要求就是请你编程判定:
对给定的mxn的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。
如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。
如果无法分割,则输出0
程序输入输出格式要求:
程序先读入两个整数mn用空格分割(m,n<
10)
表示表格的宽度和高度
接下来是n行,每行m个正整数,用空格分开。
每个整数不大于10000
在所有解中,包含左上角的分割区可能包含的最小的格子数目。
33
10152
20301
123
则程序输出:
43
1111
130802
111100
10
#defineN10
intnum[N][N];
inttag[N][N]={0};
intm,n;
intr=100;
intfind(inti,intj,intt,intntag[][N])
0||i>
=n||j<
0||j>
=m||ntag[i][j]==1)
ntag[i][j]=1;
if(tag[i][j]!
=t)
count++;
count+=find(i-1,j,t,ntag);
count+=find(i+1,j,t,ntag);
count+=find(i,j-1,t,ntag);
count+=find(i,j+1,t,ntag);
intisbad()
inti,j,k=0;
intt=tag[0][0];
intntag1[N][N]={0};
intntag2[N][N]={0};
intge1=find(0,0,t,ntag1);
for(i=0;
n;
for(j=0;
m;
k=1;
break;
if(k==1)
if(i==n&
j==m)
intge2=find(i,j,tag[i][j],ntag2);
returnge1+ge2!
=m*n;
intbad(inti,intj)
=m||tag[i][j]==1)
return1;
tag[i][j]=1;
intb=isbad();
tag[i][j]=0;
returnb;
voidgo(inti,intj,intk,intcount)
{
if(bad(i,j)||count<
num[i][j])
return;
if(count==num[i][j])
if(r>
k)
r=k;
count-=num[i][j];
go(i-1,j,k,count);
go(i+1,j,k,count);
go(i,j-1,k,count);
go(i,j+1,k,count);
%d%d"
m,&
inthalf=0;
num[i][j]);
half+=num[i][j];
if(half%2==0&
half>
=num[0][0]*2)
half/=2;
go(0,0,0,half);
if(r==100)
r=0;
r);
隔行变色
Excel表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的样式。
小明设计的样式为:
第1行蓝色,第2行白色,第3行蓝色,第4行白色,....
现在小明想知道,从第21行到第50行一共包含了多少个蓝色的行。
请你直接提交这个整数,千万不要填写任何多余的内容。
立方尾不变
有些数字的立方的末尾正好是该数字本身。
比如:
1,4,5,6,9,24,25,....
请你计算一下,在10000以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一共有多少个。
请提交该整数,不要填写任何多余的内容。
三羊献瑞
观察下面的加法算式:
祥瑞生辉
+
三羊献瑞
-------------------
三羊生瑞气
(如果有对齐问题,可以参看【图1.jpg】)
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。
格子中输出
StringInGrid函数会在一个指定大小的格子中打印指定的字符串。
要求字符串在水平、垂直两个方向上都居中。
如果字符串太长,就截断。
如果不能恰好居中,可以稍稍偏左或者偏上一点。
下面的程序实现这个逻辑,请填写划线部分缺少的代码。
#include<
stdio.h>
string.h>
voidStringInGrid(intwidth,intheight,constchar*s)
{
inti,k;
charbuf[1000];
strcpy(buf,s);
if(strlen(s)>
width-2)buf[width-2]=0;
printf("
+"
for(i=0;
i<
width-2;
i++)printf("
-"
+\n"
for(k=1;
k<
(height-1)/2;
k++){
|"
"
|\n"
}
%*s%s%*s"
_____________________________________________);
//填空
for(k=(height-1)/2+1;
height-1;
k++){
intmain()
StringInGrid(20,6,"
abcd1234"
return0;
对于题目中数据,应该输出:
+------------------+
|