蓝桥杯作业1版本2.docx

上传人:b****6 文档编号:5834746 上传时间:2023-01-01 格式:DOCX 页数:24 大小:82.79KB
下载 相关 举报
蓝桥杯作业1版本2.docx_第1页
第1页 / 共24页
蓝桥杯作业1版本2.docx_第2页
第2页 / 共24页
蓝桥杯作业1版本2.docx_第3页
第3页 / 共24页
蓝桥杯作业1版本2.docx_第4页
第4页 / 共24页
蓝桥杯作业1版本2.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

蓝桥杯作业1版本2.docx

《蓝桥杯作业1版本2.docx》由会员分享,可在线阅读,更多相关《蓝桥杯作业1版本2.docx(24页珍藏版)》请在冰豆网上搜索。

蓝桥杯作业1版本2.docx

蓝桥杯作业1版本2

1、题目描述

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

过程如下:

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

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

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

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

他在航海日志中写到:

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

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

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

格式是:

人数,人数,...

例如,有一种可能是:

20,5,4,2,0

穷举不丢人。

代码实现:

#include

usingnamespacestd;

intmain()

{

intn,a,b,c;//a第三轮的人数,b二轮,c一轮

for(a=2;a<=20;a++)

for(b=a;b<=20;b++)

for(c=b;c<=20;c++)

for(n=c;n<=20;n++)

{

if(n*a*b*c==a*b*c+b*c*n+a*c*n+a*b*n&&a!

=b&&b!

=c&&c!

=n)

{

cout<

}

}

return0;

}

运行结果:

2、猜年龄

美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。

他曾在1935~1936年应邀来中国清华大学讲学。

一次,他参加某个重要会议,年轻的脸孔引人注目。

于是有人询问他的年龄,他回答说:

“我年龄的立方是个4位数。

我年龄的4次方是个6位数。

这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。

请你推算一下,他当时到底有多年轻。

答案写在这。

代码实现:

#include

usingnamespacestd;

#include;

boolf(intn,intm)

{

if(n>=10000||n<1000||m>=1000000||m<100000)

returnfalse;

intc[10]={0};

inti=0;

while(n)

{

c[n%10]=1;

n/=10;

i++;

}

while(m)

{

c[m%10]=1;

m/=10;

i++;

}

for(intj=0;j<10;j++)

{

if(c[j]!

=1)returnfalse;

}

returntrue;

}

intmain()

{

inta;

for(a=11;a<=100;a++)

{

if(f(pow(a,3),pow(a,4)))

{

cout<

cout<

}

}

return0;

}

运行结果:

3、题目描述

公交车票价为5角。

假设每位乘客只持有两种币值的货币:

5角、1元。

再假设持有5角的乘客有m人,持有1元的乘客有n人。

由于特殊情况,开始的时候,售票员没有零钱可找。

我们想知道这m+n名乘客以什么样的顺序购票则可以顺利完成购票过程。

显然,m=n的时候,有些情况也不行。

比如,第一个购票的乘客就持有1元。

下面的程序计算出这m+n名乘客所有可能顺利完成购票的不同情况的组合数目。

注意:

只关心5角和1元交替出现的次序的不同排列,持有同样币值的两名乘客交换位置并不算做一种新的情况来计数。

//m:

持有5角币的人数

//n:

持有1元币的人数

//返回:

所有顺利完成购票过程的购票次序的种类数

intf(intm,intn)

{

if(m

if(n==0)return1;

returnf(m-1,n)+f(m,n-1);

}

55511

5551

5515

5155

1555

 

/////////////

5551111

5155111

5115511

小贴士:

1.浮点的非精确比较。

不能用==

a.小于一个临界值

b.转化为整数

2.有理数的高精度表示

注意:

舍入规则的细节

有效数字位数

3.有理数的整数分数表示法

4.IEEE754规则

特殊的有理数值

NaN

Infinite

-Infinite

0.0

-0.0

4、格子中输出

StringInGrid函数会在一个指定大小的格子中打印指定的字符串。

要求字符串在水平、垂直两个方向上都居中。

如果字符串太长,就截断。

如果不能恰好居中,可以稍稍偏左或者偏上一点。

下面的程序实现这个逻辑,请填写划线部分缺少的代码。

#include

#include

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

printf("+\n");

for(k=1;k<(height-1)/2;k++){

printf("|");

for(i=0;i

printf("|\n");

}

printf("|");

printf("%*s%s%*s",(width-2-strlen(buf))/2,"",buf,(width-2-strlen(buf))/2,"")

);//填空

printf("|\n");

for(k=(height-1)/2+1;k

printf("|");

for(i=0;i

printf("|\n");

}

printf("+");

for(i=0;i

printf("+\n");

}

intmain()

{

StringInGrid(20,6,"abcd1234");

return0;

}

对于题目中数据,应该输出:

+------------------+

||

|abcd1234|

||

||

+------------------+

(如果出现对齐问题,参看【图1.jpg】)

注意:

只填写缺少的内容,不要书写任何题面已有代码或说明性文字。

5、阶乘位数

9的阶乘等于:

362880

它的二进制表示为:

1011000100110000000

这个数字共有19位。

请你计算,9999的阶乘的二进制表示一共有多少位?

注意:

需要提交的是一个整数,不要填写任何无关内容(比如说明解释等)

代码实现:

#include

usingnamespacestd;

#definepi3.14159

#include

intmain()//运用斯特林公式

{

intn,sum;

cin>>n;

if(n==1||n==2)

sum=n;

else

sum=(int)((n*log(n)-n+0.5*log(2*n*pi))/log

(2))+1;

cout<

return0;

}

运行结果:

6、题目描述

古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。

之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现0的概念!

罗马数字的表示主要依赖以下几个基本符号:

I1

V5

X10

L50

C100

D500

M1000

这里,我们只介绍一下1000以内的数字的表示法。

单个符号重复多少次,就表示多少倍。

最多重复3次。

比如:

CCC表示300XX表示20,但150并不用LLL表示,这个规则仅适用于IXCM。

如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。

比如:

IX表示9IV表示4XL表示40更多的示例参见下表,你找到规律了吗?

I,1

II,2

III,3

IV,4

V,5

VI,6

VII,7

VIII,8

IX,9

X,10

XI,11

XII,12

XIII,13

XIV,14

XV,15

XVI,16

XVII,17

XVIII,18

XIX,19

XX,20

XXI,21

XXII,22

XXIX,29

XXX,30

XXXIV,34

XXXV,35

XXXIX,39

XL,40

L,50

LI,51

LV,55

LX,60

LXV,65

LXXX,80

XC,90

XCIII,93

XCV,95

XCVIII,98

XCIX,99

C,100

CC,200

CCC,300

CD,400

D,500

DC,600

DCC,700

DCCC,800

CM,900

CMXCIX,999

本题目的要求是:

请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。

输入格式是:

第一行是整数n,表示接下来有n个罗马数字(n<100)。

以后每行一个罗马数字。

罗马数字大小不超过999。

要求程序输出n行,就是罗马数字对应的十进制数据。

例如,用户输入:

3

LXXX

XCIII

DCCII

则程序应该输出:

80

93

702

-----------------------

遇到Isum+=1

遇到Xsum+=10

遇到Vsum+=5

.if(包含"IX")sum-=2;

if(包含"IV")sum-=2;

if(包含"XC")sum-=20;

...

代码实现:

#include

#include

#include

usingnamespacestd;

intRoman(chara)

{

switch(a)

{

case'I':

return1;break;

case'V':

return5;break;

case'X':

return10;break;

case'L':

return50;break;

case'C':

return100;break;

case'D':

return500;break;

case'M':

return1000;break;

}

}

voidreduce(int&sum,chara,charb)

{

if(a=='I'&&b=='V')sum-=2;

elseif(a=='I'&&b=='X')sum-=2;

elseif(a=='X'&&b=='L')sum-=20;

elseif(a=='X'&&b=='C')sum-=20;

elseif(a=='C'&&b=='D')sum-=200;

elseif(a=='C'&&b=='M')sum-=200;

}

intf(chara[100])

{

intsum=0;

for(inti=0;a[i]!

='\0';i++)

{

sum+=Roman(a[i]);

if(a[i+1]!

='\0')

reduce(sum,a[i],a[i+1]);

}

returnsum;

}

intmain()

{

intn;

intb[100];

chara[100];

cin>>n;

for(inti=0;i

{

cin>>a;

b[i]=f(a);

}

for(inti=0;i

{

cout<

}

return0;

}

运行结果:

7、题目描述

A、B、C、D、E、F、G、H、I、J共10名学生有可能参加本次计算机竞赛,也可能不参加。

因为某种原因,他们是否参赛受到下列条件的约束:

1.如果A参加,B也参加;

2.如果C不参加,D也不参加;

3.A和C中只能有一个人参加;

4.B和D中有且仅有一个人参加;

5.D、E、F、G、H中至少有2人加;

6.C和G或者都参加,或者都不参加;

7.C、E、G、I中至多只能2人参加

8.如果E参加,那么F和G也都参加。

9.如果F参加,G、H就不能参加

10.如果I、J都不参加,H必须参加

请编程根据这些条件判断这10名同学中参赛者名单。

如果有多种可能,则输出所有的可能情况。

每种情况占一行。

参赛同学按字母升序排列,用空格分隔。

比如:

CDGJ

就是一种可能的情况。

多种情况的前后顺序不重要

技巧:

参加为1,不参加为0,不用boolean类型

3if(a+c<=1)

4if(b+d==1)

代码实现:

#include

#include

#include

usingnamespacestd;

intmain()

{

for(intA=0;A<=1;A++)

{

for(intB=0;B<=1;B++)

{

if(A==1&&B==0)continue;

for(intC=0;C<=1;C++)

{

if(A+C==2)continue;

for(intD=0;D<=1;D++)

{

if(C==0&&D==1)continue;

if(B+D!

=1)continue;

for(intE=0;E<=1;E++)

{

for(intF=0;F<=1;F++)

{

for(intG=0;G<=1;G++)

{

if(C+G==1)continue;

for(intH=0;H<=1;H++)

{

if(D+E+F+G+H<2)continue;

if(F==1&&G+H!

=0)continue;

for(intI=0;I<=1;I++)

{

if(C+E+G+I>2)continue;

if(E==1&&F+G!

=2)continue;

for(intJ=0;J<=1;J++)

{

if(I+J+H==0)continue;

if(A)cout<<'A'<<"";

if(B)cout<<'B'<<"";

if(C)cout<<'C'<<"";

if(D)cout<<'D'<<"";

if(E)cout<<'E'<<"";

if(F)cout<<'F'<<"";

if(G)cout<<'G'<<"";

if(H)cout<<'H'<<"";

if(I)cout<<'I'<<"";

if(J)cout<<'J'<<"";

cout<

}

}

}

}

}

}

}

}

}

}

return0;

}

运行结果:

8、啤酒和饮料

啤酒每罐2.3元,饮料每罐1.9元。

小明买了若干啤酒和饮料,一共花了82.3元。

我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。

注意:

答案是一个整数。

请通过浏览器提交答案。

不要书写任何多余的内容(例如:

写了饮料的数量,添加说明文字等)。

代码实现:

#include

#include

usingnamespacestd;

intmain()

{

inta=23,b=19,n=823;

for(inti=1;i

for(intj=i;j

{

if(i*23+j*19==823)cout<<"啤酒:

"<

"<

}

return0;

}

运行结果:

9、题目描述

匪警请拨110,即使手机欠费也可拨通!

为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!

某批警察叔叔正在进行智力训练:

123456789=110;

请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。

之间没有填入符号的数字组合成一个数,例如:

12+34+56+7-8+9就是一种合格的填法;123+4+5+67-89是另一个可能的答案。

请你利用计算机的优势,帮助警察叔叔快速找到所有答案。

每个答案占一行。

形如:

12+34+56+7-8+9

123+4+5+67-89

......

已知的两个答案可以输出,但不计分。

各个答案的前后顺序不重要。

注意:

请仔细调试!

您的程序只有能运行出正确结果的时候才有机会得分!

请把所有类写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。

相关的工程文件不要拷入。

请不要使用package语句。

源程序中只能出现JDK1.5中允许的语法或调用。

不能使用1.6或更高版本。

代码实现:

#include

#include

#include

usingnamespacestd;

voidprint(inta[10])

{

intb[10];

for(inti=0;i<10;i++)

b[i]=i;

for(inti=1;i<=9;i++)

{

cout<

if(a[i]==1)cout<<"+";

elseif(a[i]==2)cout<<"-";

}

cout<<"=110"<

}

voidf(inta[10],intn)

{

if(n==9)

{

intsum=0,x=0,k=9;

for(inti=9;i>=0;i--)

{

if(a[i]==1||i==0)

{

for(intj=i+1;j<=k;j++)

{

x=x*10+j;

}

sum+=x;

x=0;k=i;

}

elseif(a[i]==2)

{

for(intj=i+1;j<=k;j++)

{

x=x*10+j;

}

sum-=x;

x=0;k=i;

}

}

if(sum==110)print(a);

}

else

{

for(inti=1;i<=3;i++)

{

a[n]=i;

f(a,n+1);

a[n]=3;

}

}

}

intmain()

{

inta[10]={0};//9个符号位

a[9]=3;//9后的默认为空1+2-3空

f(a,1);

return0;

}

运行结果:

10、消除尾一

下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0

如果最后一位是0,则原数字保持不变。

如果采用代码中的测试数据,应该输出:

0000000000000000000000000110011100000000000000000000000001100000

0000000000000000000000000000110000000000000000000000000000001100

请仔细阅读程序,填写划线部分缺少的代码。

#include

voidf(intx)

{

inti;

for(i=0;i<32;i++)printf("%d",(x>>(31-i))&1);

printf("");

x=(x+1)&x;

for(i=0;i<32;i++)printf("%d",(x>>(31-i))&1);

printf("\n");

}

intmain()

{

f(103);

f(12);

return0;

}

注意:

只填写缺少的内容,不要书写任何题面已有代码或说明性文字。

11、一步之遥

从昏迷中醒来,小明发现自己被关在X星球的废矿车里。

矿车停在平直的废弃的轨道上。

他的面前是两个按钮,分别写着“F”和“B”。

小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。

按F,会前进97米。

按B会后退127米。

透过昏暗的灯光,小明看到自己前方1米远正好有个监控探头。

他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助。

或许,通过多次操作F和B可以办到。

矿车上的动力已经不太足,黄色的警示灯在默默闪烁...

每次进行F或B操作都会消耗一定的能量。

小明飞快地计算,至少要多少次操作,才能把矿车准确地停在前方1米远的地方。

请填写为了达成目标,最少需要操作的次数。

注意,需要提交的是一个整数,不要填写任何无关内容(比如:

解释说明等)

代码实现:

#include

#include

#include

usingnamespacestd;

intmain()

{

intn=1000;

for(inti=1;i<1000;i++)

for(intj=1;j<1000;j++)

{

if(i*97+1==127*j)

{

if(i+j

}

}

cout<

return0;

}

运行结果:

12、题目描述

有N个人参加100米短跑比赛。

跑道为8条。

程序的任务是按照尽量使每组的人数相差最少的原则分组。

例如:

N=8时,分成1组即可。

N=9时,分成2组:

一组5人,一组4人。

N=25时,分4组:

7、6、6、6。

请编程计算分组数字。

要求从键盘输入一个正整数(1~100之间,不必考虑输入错误的情况),表示参赛的人数。

程序输出每个组的人数。

从大到小顺序输出,每个数字一行。

比如,用户输入:

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

当前位置:首页 > 法律文书 > 判决书

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

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