第三届蓝桥杯C语言本科组复赛题与及解析.docx

上传人:b****8 文档编号:30660758 上传时间:2023-08-19 格式:DOCX 页数:14 大小:221.54KB
下载 相关 举报
第三届蓝桥杯C语言本科组复赛题与及解析.docx_第1页
第1页 / 共14页
第三届蓝桥杯C语言本科组复赛题与及解析.docx_第2页
第2页 / 共14页
第三届蓝桥杯C语言本科组复赛题与及解析.docx_第3页
第3页 / 共14页
第三届蓝桥杯C语言本科组复赛题与及解析.docx_第4页
第4页 / 共14页
第三届蓝桥杯C语言本科组复赛题与及解析.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

第三届蓝桥杯C语言本科组复赛题与及解析.docx

《第三届蓝桥杯C语言本科组复赛题与及解析.docx》由会员分享,可在线阅读,更多相关《第三届蓝桥杯C语言本科组复赛题与及解析.docx(14页珍藏版)》请在冰豆网上搜索。

第三届蓝桥杯C语言本科组复赛题与及解析.docx

第三届蓝桥杯C语言本科组复赛题与及解析

第三届蓝桥杯C语言本科组复赛题与及解析

1:

假设有两种微生物X和Y

X出生后每隔3分钟分裂一次<数目加倍),Y出生后每隔2分钟分裂一次<数目加倍)。

一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。

现在已知有新出生的X=10,Y=89,求60分钟后Y的数目。

如果X=10,Y=90呢?

本题的要求就是写出这两种初始条件下,60分钟后Y的数目。

题目的结果令你震惊吗?

这不是简单的数字游戏!

真实的生物圈有着同样脆弱的性质!

也许因为你消灭的那只Y就是最终导致Y种群灭绝的最后一根稻草!

 //Muse牧马指证这道题的答案是错的并给出了代码。

我理解错了题意,误以为是“兔子繁殖”了。

//代码:

#include

intmain(>

{

longintX=10,Y=90。

for(intk=1。

k<=120。

k++>//半分钟一个单位

{

if(k%2==1>Y-=X。

//因为X出生半分钟后就要吃Y,尔后每1分钟要吃Y,所以永远都是奇数个半分钟的时候吃Y,又因为此时X不会增长<题目为了减小讨论的复杂度),所以直接减X数量即可。

if(k%4==0>Y*=2。

//每2分钟翻倍

if(k%6==0>X*=2。

//每3分钟翻倍,X和Y的翻倍是相互独立的,不需要另作讨论。

}

printf("%d",Y>。

return0。

}b5E2RGbCAP

 

2:

ABCDE*?

=EDCBA

“ABCDE代表不同的数字,问号也代表某个数字!

"

 

21978

//5层循环就OK了

3:

有一群海盗<不多于20人),在船上比拼酒量。

过程如下:

打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。

再打开一瓶酒平分,又有倒下的,再次重复......直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。

当第4瓶酒平分喝下后,大家都倒下了。

等船长醒来,发现海盗船搁浅了。

他在航海日志中写到:

“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”

请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。

如果有多个可能的答案,请列出所有答案,每个答案占一行。

格式是:

人数,人数,...

例如,有一种可能是:

20,5,4,2,0p1EanqFDPw

 

//松鼠123告诉我这道题的答案要严格递减的,所以我删掉了不符合要求的组合。

205420

189320

1510320

12642

//先求处4个数【递减的,4层循环就OK】的最小公倍数,然后求倒数和是否为1

4:

某电视台举办了低碳生活大奖赛。

题目的计分规则相当奇怪:

每位选手需要回答10个问题<其编号为1到10),越后面越有难度。

答对的,当前分数翻倍;答错了则扣掉与题号相同的分数<选手必须回答问题,不回答按错误处理)。

每位选手都有一个起步的分数为10分。

某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他<她)哪个题目答对了,哪个题目答错了吗?

如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。

例如:

0010110011就是可能的情况。

你的任务是算出所有可能情况。

每个答案占一行。

DXDiTa9E3d

 

1011010000

0111010000

0010110011

//赢或不赢,只有10道题,递归去吧。

5:

顺时针转置矩阵

sizeof(int>*rank*rank

rank-1-i/rank+rank*(i%rank>//经神@雕指正。

我写的4而不是rank。

应该是rank才对。

RTCrpUDGiT

voidrotate(int*x,intrank>

{

int*y=(int*>malloc(___________________>。

//填空

for(inti=0。

i

i++>

{

y[_________________________]=x[i]。

//填空

}

for(i=0。

i

i++>

{

x[i]=y[i]。

}

free(y>。

}

intmain(intargc,char*argv[]>

{

intx[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}。

intrank=4。

rotate(&x[0][0],rank>。

for(inti=0。

i

i++>

{

for(intj=0。

j

j++>

{

printf("%4d",x[i][j]>。

}

printf("\n">。

}

return0。

}5PCzVD7HxA

6:

大数乘法

n3/base+n2/base+n4%base

r[2]/base

voidbigmul(intx,inty,intr[]>

{

intbase=10000。

intx2=x/base。

intx1=x%base。

inty2=y/base。

inty1=y%base。

intn1=x1*y1。

intn2=x1*y2。

intn3=x2*y1。

intn4=x2*y2。

r[3]=n1%base。

r[2]=n1/base+n2%base+n3%base。

r[1]=____________________________________________。

//填空

r[0]=n4/base。

r[1]+=_______________________。

//填空

r[2]=r[2]%base。

r[0]+=r[1]/base。

r[1]=r[1]%base。

}

intmain(intargc,char*argv[]>

{

intx[]={0,0,0,0}。

bigmul(87654321,12345678,x>。

printf("%d%d%d%d\n",x[0],x[1],x[2],x[3]>。

return0。

}jLBHrnAILg

7:

6*6棋盘放棋子,使每行每列都是3个<0未放1放了)

NumRow!

=3||NumCol!

=3

f(x,r,c+1>

x[r][c]==1

intN=0。

boolCheckStoneNum(intx[][6]>

{

for(intk=0。

k<6。

k++>

{

intNumRow=0。

intNumCol=0。

for(inti=0。

i<6。

i++>

{

if(x[k][i]>NumRow++。

if(x[i][k]>NumCol++。

}

if(_____________________>returnfalse。

//填空

}

returntrue。

}

intGetRowStoneNum(intx[][6],intr>

{

intsum=0。

for(inti=0。

i<6。

i++>if(x[r][i]>sum++。

returnsum。

}

intGetColStoneNum(intx[][6],intc>

{

intsum=0。

for(inti=0。

i<6。

i++>if(x[i][c]>sum++。

returnsum。

}

voidshow(intx[][6]>

{

for(inti=0。

i<6。

i++>

{

for(intj=0。

j<6。

j++>printf("%2d",x[i][j]>。

printf("\n">。

}

printf("\n">。

}

voidf(intx[][6],intr,intc>。

voidGoNext(intx[][6],intr,intc>

{

if(c<6>

_______________________。

//填空

else

f(x,r+1,0>。

}

voidf(intx[][6],intr,intc>

{

if(r==6>

{

if(CheckStoneNum(x>>

{

N++。

show(x>。

}

return。

}

if(______________>//已经放有了棋子

{

GoNext(x,r,c>。

return。

}

intrr=GetRowStoneNum(x,r>。

intcc=GetColStoneNum(x,c>。

if(cc>=3>//本列已满

GoNext(x,r,c>。

elseif(rr>=3>//本行已满

f(x,r+1,0>。

else

{

x[r][c]=1。

GoNext(x,r,c>。

x[r][c]=0。

if(!

(3-rr>=6-c||3-cc>=6-r>>//本行或本列严重缺子,则本格不能空着!

GoNext(x,r,c>。

}

}

intmain(intargc,char*argv[]>

{

intx[6][6]={

{1,0,0,0,0,0},

{0,0,1,0,1,0},

{0,0,1,1,0,1},

{0,1,0,0,1,0},

{0,0,0,1,0,0},

{1,0,1,0,0,1}

}。

f(x,0,0>。

printf("%d\n",N>。

return0。

}xHAQX74J0X

8:

这个程序的任务就是把一串拼音字母转换为6位数字<密码)。

我们可以使用任何好记的拼音串(比如名字,王喜明,就写:

wangximing>作为输入,程序输出6位数字。

变换的过程如下:

第一步.把字符串6个一组折叠起来,比如wangximing则变为:

wangxi

ming

第二步.把所有垂直在同一个位置的字符的ascii码值相加,得出6个数字,如上面的例子,则得出:

228202220206120185

第三步.再把每个数字“缩位”处理:

就是把每个位的数字相加,得出的数字如果不是一位数字,就再缩位,直到变成一位数字为止。

例如:

228=>2+2+8=12=>1+2=3

上面的数字缩位后变为:

344836,这就是程序最终的输出结果!

要求程序从标准输入接收数据,在标准输出上输出结果。

输入格式为:

第一行是一个整数n<<100),表示下边有多少输入行,接下来是n行字符串,就是等待变换的字符串。

输出格式为:

n行变换后的6位密码。

LDAYtRyKfE

 

#include

#include

#include

intstr[6],istr。

intres[102][6],ires。

voidgetstr(>//readstrfromstdin

{

charch。

while((ch=getchar(>>!

='\n'>

{

str[istr%6]+=ch。

istr++。

}

}

voidcal(>//calculatetheresult

{

inti,t。

for(i=0。

i<6。

i++>

{

while(str[i]>9>

{

t=str[i]。

str[i]=0。

while(t>

{

str[i]+=t%10。

t/=10。

}

}

}

}

voidsave(>//puttheresultintoresarray

{

inti。

for(i=0。

i<6。

i++>

res[ires][i]=str[i]。

ires++。

}

voidmain(>

{

intn,i,j。

scanf("%d",&n>。

getchar(>。

while(n-->

{

memset(str,0,sizeof(str>>。

istr=0。

getstr(>。

cal(>。

save(>。

}

for(i=0。

i

i++>//printtheresarraytostdout

{

for(j=0。

j<6。

j++>printf("%d",res[i][j]>。

printf("\n">。

}

}Zzz6ZB2Ltk

9:

足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能。

假设有甲、乙、丙、丁四个球队。

根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表:

甲乙丙丁

甲-0.10.30.5

乙0.9-0.70.4

丙0.70.3-0.2

丁0.50.60.8-

数据含义:

甲对乙的取胜概率为0.1,丙对乙的胜率为0.3,...

现在要举行一次锦标赛。

双方抽签,分两个组比,获胜的两个队再争夺冠军。

<参见【1.jpg】)

请你进行10万次模拟,计算出甲队夺冠的概率。

dvzfvkwMI1

 【正确思路请看Muse牧马的评论】

思路:

p=1-甲输的概率甲输的话,有两种情况:

1:

甲在第一轮中就输了2:

甲在晋级后,决赛中输了假设甲先和X对决,则另两组是Y和Z对决其中Y和Z对决有两种情况发生:

要么Y赢,要么Z赢所以综合上述讨论,可以算出甲输的概率是:

P(X,甲>+P(甲,X>*P(Y,Z>*P(Y,甲>+P(甲,X>*P(Z,Y>*P(Z,甲>即甲赢的概率是1减去上诉结果。

10万数据模拟可以得到甲赢的概率大约0.076。

rqyn14ZNXI

验算:

甲换成乙丙丁后分别算出四个数据,相加为1.0

10:

今盒子里有n个小球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断。

我们约定:

每个人从盒子中取出的球的数目必须是:

1,3,7或者8个。

轮到某一方取球时不能弃权!

A先取球,然后双方交替取球,直到取完。

被迫拿到最后一个球的一方为负方<输方)

请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A是否能赢?

程序运行时,从标准输入获得数据,其格式如下:

先是一个整数n(n<100>,表示接下来有n个整数。

然后是n个整数,每个占一行<整数<10000),表示初始球数。

程序则输出n行,表示A的输赢情况<输为0,赢为1)。

EmxvxOtOco

 

【我把10001写成了101,所以。

又悲剧了】

#13楼2018-04-0812:

34 | Muse牧马      

?

#include

#include

inta[10001]。

intb[4]={1,3,7,8}。

intmain(>

{

    inti,n,j。

    freopen("2.out","w",stdout>。

    memset(a,0,sizeofa>。

//初始化判定数组为0   

    a[0]=1。

//说明对方取完了最后一堆,那么自己胜利

    for(i=1。

i<=10000。

i++>

        for(j=0。

j<4。

j++>if(i-b[j]>=0>

        {

            if(a[i-b[j]]==0>//有取法能致使对方输,那么自己就要赢

            {

                a[i]=1。

                break。

            }

        }

    for(intk=0。

k<=20。

k++>

    printf("%d:

%d\n",k,a[k]>。

        scanf("%d",&n>。

        while(n-->

        {

            scanf("%d",&i>。

            printf("%d\n",a[i]>。

//直接输出即可,不需要存储下来统一输出,PS:

ACM里都是这样处理的。

        }

    return0。

}

申明:

所有资料为本人收集整理,仅限个人学习使用,勿做商业用途。

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

当前位置:首页 > 党团工作 > 其它

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

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