蓝桥杯第2届预赛本科C语言真题解析Word格式文档下载.docx

上传人:b****4 文档编号:15924863 上传时间:2022-11-17 格式:DOCX 页数:15 大小:22.21KB
下载 相关 举报
蓝桥杯第2届预赛本科C语言真题解析Word格式文档下载.docx_第1页
第1页 / 共15页
蓝桥杯第2届预赛本科C语言真题解析Word格式文档下载.docx_第2页
第2页 / 共15页
蓝桥杯第2届预赛本科C语言真题解析Word格式文档下载.docx_第3页
第3页 / 共15页
蓝桥杯第2届预赛本科C语言真题解析Word格式文档下载.docx_第4页
第4页 / 共15页
蓝桥杯第2届预赛本科C语言真题解析Word格式文档下载.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

蓝桥杯第2届预赛本科C语言真题解析Word格式文档下载.docx

《蓝桥杯第2届预赛本科C语言真题解析Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《蓝桥杯第2届预赛本科C语言真题解析Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。

蓝桥杯第2届预赛本科C语言真题解析Word格式文档下载.docx

=0

歌赛新规则

歌手大赛的评分规则一般是去掉一个最高分,去掉一个最低分,剩下的分数求平均。

当评委较少的时候,如果我们只允许去掉一个分数,该如何设计规则呢?

有人提出:

应该去掉与其余的分数平均值相差最远的那个分数。

即“最离群”的分数。

以下的程序用于实现这个功能。

其中x存放所有评分,n表示数组中元素的个数。

函数返回最“离群”的那个分数值。

doublescore(doublex[],intn)

{

inti,j;

doubledif=-1;

doublebad;

for(i=0;

n;

doublesum=0;

for(j=0;

j<

j++)

if(________)sum+=x[j];

doublet=x[i]-sum/(n-1);

if(t<

0)t=-t;

if(t>

dif)

dif=t;

bad=x[i];

printf("

%d,%f\n"

i,x[i]);

returnbad;

}

j!

=i

反转串

我们把“cba”称为“abc”的反转串。

下面的代码可以把buf中的字符反转。

其中n表示buf中待反转的串的长度。

请补充缺少的代码。

voidreverse_str(char*buf,intn)

if(n<

2)return;

chartmp=buf[0];

buf[0]=buf[n-1];

buf[n-1]=tmp;

_______________________________;

reverse_str(buf+1,n-2)

n进制小数

将任意十进制正小数分别转换成2,3,4,5,6,7,8,9进制正小数,小数点后保留8位,并输出。

例如:

若十进制小数为0.795,则输出:

十进制正小数0.795000转换成2进制数为:

0.11001011

十进制正小数0.795000转换成3进制数为:

0.21011011

十进制正小数0.795000转换成4进制数为:

0.30232011

十进制正小数0.795000转换成5进制数为:

0.34414141

十进制正小数0.795000转换成6进制数为:

0.44341530

十进制正小数0.795000转换成7进制数为:

0.53645364

十进制正小数0.795000转换成8进制数为:

0.62702436

十进制正小数0.795000转换成9进制数为:

0.71348853

以下代码提供了这个功能。

其中,dTestNo表示待转的十进制小数。

iBase表示进制数。

请填写缺失的部分。

voidfun(doubledTestNo,intiBase)

intiT[8];

intiNo;

printf("

十进制正小数%f转换成%d进制数为:

"

dTestNo,iBase);

for(iNo=0;

iNo<

8;

iNo++)

dTestNo*=iBase;

iT[iNo]=________________;

if(___________________)dTestNo-=iT[iNo];

0."

);

iNo<

iNo++)printf("

%d"

iT[iNo]);

\n"

voidmain()

{

doubledTestNo=0.795;

intiBase;

for(iBase=2;

iBase<

=9;

iBase++)

fun(dTestNo,iBase);

(int)(dTestNo)

dTestNo>

iT[iNo]*1.0

字符串的轮换

串“abcd”每个字符都向右移位,最右的移动到第一个字符的位置,就变为“dabc”。

这称为对串进行位移=1的轮换。

同理,“abcd”变为:

“cdab”则称为位移=2的轮换。

下面的代码实现了对串s进行位移为n的轮换。

voidshift(char*s,intn)

char*p;

char*q;

intlen=strlen(s);

if(len==0)return;

=0||n>

=len)return;

char*s2=(char*)malloc(_________);

p=s;

q=s2+n%len;

while(*p)

{

*q++=*p++;

if(q-s2>

=len)

*q=___________;

q=s2;

strcpy(s,s2);

free(s2);

sizeof(char)*(len+1)

'

\0'

中奖计算

某抽奖活动的规则是:

每位参与者在纸上写下一个8位数的号码。

最后通过摇奖的办法随机产生一个8位数字。

参与者写下的数字中最多有多少个连续位与开奖号码中的相同,则称为中了几个号。

小张写的数字是:

12345678,而开奖号码是:

42347856。

则称小张中了3个号,因为其中最长的相同连续位是:

“234”。

如果小张写的是:

87654321,则他只中了一个号。

下面的代码根据传入的参数,返回中了几个号。

其中:

a表示被评价的号码,b表示摇号产生的数字。

请填写缺少的代码。

把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。

intg(inta,intb)

charsa[]="

00000000"

;

charsb[]="

intn=0;

sprintf(sa,"

%8d"

a);

sprintf(sb,"

b);

for(j=1;

=8-i;

chart=________;

sa[i+j]=0;

if(strstr(sb,sa+i))

{

if(j>

n)_________;

}

sa[i+j]=t;

returnn;

sa[i+j]

n=j

概率问题

某个袋子中有红球m个,白球n个。

现在要从中取出x个球。

那么红球数目多于白球的概率是多少呢?

下面的代码解决了这个问题。

其中的y表示红球至少出现的次数。

这与前文的问题是等价的。

因为如果取30个球,要求红球数大于白球数,则等价于至少取出16个红球。

请根据仅存的线索,判断程序逻辑,并补全缺少的代码。

/*

m:

袋中红球的数目

n:

袋中白球的数目

x:

需要取出的数目

y:

红球至少出现的次数

*/

doublepro(intm,intn,intx,inty)

if(y>

x)return0;

if(y==0)return1;

m)return0;

if(x-n>

y)return1;

doublep1=_______________________;

doublep2=_______________________;

return(double)m/(m+n)*p1+(double)n/(m+n)*p2;

pro(m-1,n,x-1,y-1)

pro(m,n-1,x-1,y)

上三角方阵

方阵的主对角线之上称为“上三角”。

请你设计一个用于填充n阶方阵的上三角区域的程序。

填充的规则是:

使用1,2,3….的自然数列,从左上角开始,按照顺时针方向螺旋填充。

当n=3时,输出:

123

64

5

当n=4时,输出:

1234

9105

86

7

当n=5时,输出:

12345

1213146

11157

108

9

程序运行时,要求用户输入整数n(3~20)

程序输出:

方阵的上三角部分。

要求格式:

每个数据宽度为4,右对齐。

(1)编程思路。

上三角阵的构造可以看成由向右填充(行号不变、列号加1,即col++)、斜向下填充(row++、col--)和向上填充(行号减1、列号不变,即row--)三个子过程不断交替完成的。

例如,示例中的3阶上三角阵可以看成由向右填充(1、2、3),斜向下填充(4、5)和向上填充(6)这3个子过程完成的。

4阶上三角阵可以看成由向右填充(1、2、3、4),斜向下填充(5、6、7)、向上填充(8、9)和向右填充(10)这4个子过程完成的。

n阶上三角阵可以看成由n个子过程完成,每个子过程为向右填充、斜向下填充和向上填充这三种中的一种,用变量direction来表示,其取值为0、1或2,0表示向右填充,1表示斜向下填充,2表示向上填充。

每个子过程结束后,切换填充方向,方式为:

direction=(direction+1)%3;

n个子过程中,第1个子过程填写n个数,第2个子过程填写n-1个数,…,最后一个子过程填写1个数。

因此,程序总体写成一个二重循环,描述为:

for(i=n;

i>

=1;

i--)

{

for(j=1;

j<

=i;

j++)

按填充方向,填充相应数据

direction=(direction+1)%3;

//切换填充方向

}

初始时,注意row=0,col=-1,这样向右col++后,col为0,正好填在第1个位置。

(2)源程序。

#include<

stdio.h>

intmain()

inta[20][20]={0},row,col,i,j,n,num;

intdirection=0;

scanf("

&

n);

row=0;

col=-1;

num=1;

for(i=n;

for(j=1;

switch(direction)

case0:

col++;

break;

//向右填充

case1:

row++;

col--;

//斜向下填充

case2:

r

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1