ACM软件大赛之编程大赛题目附部分答案Word文档格式.docx

上传人:b****6 文档编号:19974518 上传时间:2023-01-13 格式:DOCX 页数:17 大小:23.66KB
下载 相关 举报
ACM软件大赛之编程大赛题目附部分答案Word文档格式.docx_第1页
第1页 / 共17页
ACM软件大赛之编程大赛题目附部分答案Word文档格式.docx_第2页
第2页 / 共17页
ACM软件大赛之编程大赛题目附部分答案Word文档格式.docx_第3页
第3页 / 共17页
ACM软件大赛之编程大赛题目附部分答案Word文档格式.docx_第4页
第4页 / 共17页
ACM软件大赛之编程大赛题目附部分答案Word文档格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

ACM软件大赛之编程大赛题目附部分答案Word文档格式.docx

《ACM软件大赛之编程大赛题目附部分答案Word文档格式.docx》由会员分享,可在线阅读,更多相关《ACM软件大赛之编程大赛题目附部分答案Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。

ACM软件大赛之编程大赛题目附部分答案Word文档格式.docx

\n"

;

intmain(){

intline_max=7;

charchr='

A'

for(intline=0;

line<

line_max;

line++){loop_print(f(line+1),chr);

chr++;

return0;

题目二:

(5分)

3个

有个电子钟,12点显示为12:

00(即12小时制),那么请问一天24时间内,出现连续相同数字的钟点有几个?

#include<

usingnamespacestd;

boolcheck(inttime){

inth=time/100;

intm=time-100*h;

returnh<

=12&

&

m<

=59&

h>

0?

true:

false;

//12小时制

inttime=0;

intj(0);

//总计数器while(time<

1270){//max12:

59

intt=time;

intn[4];

for(inti=0;

i<

4;

i++){

n[i]=t%10;

t/=10;

}if(n[1]==n[2]&

(n[0]==n[1]||n[3]==n[1])&

check(time)){

//cout<

n[3]<

n[2]<

n[1]<

n[0]<

//testj++;

}time++;

total:

"

j*2<

endl;

题目三:

10进制的四位数中有几个符合如下特征:

将其分别表示为16进制、10进制、12进制,在每种状态下,分别将各个位上的数相加,能得到3个相等10进制数。

例如2992

10进制:

29922+9+9+2

=22

12进制:

18941+8+9+4

16进制:

BB011+11+0=

22

2992-2999

#include<

cmath>

usingnamespacestd;

intconvert(intn,intc){

floathigh_p=0;

intsum=0;

inta[4]={0,0,0,0};

floattestN=pow(c,(float)i);

if(n>

=testN)high_p=i;

elsebreak;

high_p!

=-1;

i++){a[i]=n/pow(c,high_p);

n-=a[i]*pow(c,high_p);

high_p--;

i++){sum+=a[i];

intj=0;

for(inti=1000;

=9999;

i++){if((convert(i,16)==convert(i,10))&

(convert(i,10)==convert(i,12))){cout<

j++;

j;

第二阶段题目:

不引入临时变量写出swap(a,b)功能

voidswap(int&

a,int&

b){

a+=b;

b=a-b;

a-=b;

she分别代表3个数字,已知:

(he)^2=she

she=?

for(inthe=15;

he<

=96;

he++)

for(ints=1;

s<

=9;

s++)if(he*he==100*s+he)std:

he*he<

有4条狗A、B、C、D,他们分别在一条100m的公路上步行,速率均为5m/s,A初始在30m处,B初始在65m处,C初始在75m处,D初始在95m处,初始左右方向是随意的,任意两狗相遇则各自掉头(掉头时间不计,速率保持5m/s)。

请问,4条狗最终都离开公路的最大时间是几秒?

95/5;

题目四:

BigBang中的高级石头剪刀布问题

Scissors-Paper

Paper-Rock

Rock-Scissors

Rock-Lizard

Lizard-Spock

Spock-Scissors

Scissors-Lizard

Lizard-Paper

Paper-Spock

Spock-Rock

规则是左边的手势赢右边的手势,现有玩家P1、P2,输入各自选择的手势,得出胜负。

intmain()

{

intp2,p1;

cout

1.Paper"

<

endl

2.Rock"

3.Lizard"

4.Spock"

5.Scissors"

endl;

cin>

>

p1>

p2;

floatn=p1-p2;

if(n*pow(-1,fabs(n))<

0)//此算法由@yaozizi提供

cout<

p2win"

elseif(n==0)

duce"

else

p1win"

题目五:

游戏规则:

21根火柴,每次取1-4根,谁取走最后一根判输。

现在人和计算机博弈,设计一个程序保证计算机必胜,要求每回合人与计算机各输入(或返回)一个代表取走火柴根数的数,直到游戏结束。

intmain(){

intn=21;

intp,c;

while(n!

=0){cin>

p;

while(p>

4||p<

=0||n-p<

0){

err,inputagain"

cin>

}if(n!

=0){if(n!

=1)cout<

5-p<

else{

PCwins"

break;

}if(n>

=5)n-=5;

题目六:

(10分)

下列式子:

2+3+4=9

1+2+3+4=10

显然右边的数都能表示为n(n>

2)个连续自然数之和(1开始),暂称之为囧数

但似乎23、32等数都不能写成几个数之和的形式,所以它们不是囧数这里有个可行的判断方法为:

上限为N,则测试

1+2+3

1+2+3+4

1+2+3+4+N

2+3+4

2+3+4++N(N-2)+(N-1)+N

是否等于N

这是一种可行但非常暴力的穷举实际上囧数还是有一些规律可循的,请设计一个优于之前提到的算法要求输入一个数,并判断它是否为囧数

/*

1•如果一个数能被奇数(>

=3)整除,则必能写成X=平均数*中间数的形式,所以是囧数

2.如果一个数是合数,如果其中有奇数因子,则回到1,为囧数;

如果它是2的乘方,则不是

囧数

证明:

它无法写成奇数个相加,因为除不尽奇数;

也不能写成偶数个相加,中间数有两个,和必为奇数,这个奇数必然是欲判断数的一个因子

3•如果一个数是素数,则必须是6、10、14、18……个数相加得来,这样才能得到奇数,根

据高斯求和公式,这样的和必有奇数因子

综上:

只有2的乘方、素数、小于6的自然数,不是囧数

*/

boolcheck(longtar){

boolflag=false;

if(tar<

6)flag=false;

else{

if(tar%2==0){//偶数是否是2的阶乘while(tar%2==0)tar/=2;

tar==1?

flag=false:

flag=true;

else{//奇数是否是素数

doubleend=tar;

for(inti=3;

=sqrt(end);

i+=2){

if(tar%i==0){flag=true;

break;

elsecontinue;

returnflag;

inttar;

cin>

tar;

boolflag=check(tar);

flag;

题目七:

现有一个固定的正方形区域,可以把它看作是一个数据库中的特别的二维码

11101

01001

01101

11011

00100

其中每一位表示黑和白,假设这种二维码容错性只有5%,即只要有1位以上不符合要求就无法识别。

现在输入一个5*5的类似区域(相当于扫描一个二维码),如果在容错范围内,则认为它可识别。

如果不是精确匹配,需输出错误位的位置。

interr=0,j=0;

chara[26];

charb[26]="

1110101001011011101100100"

25;

a[i];

if(a[i]!

=b[i]){

j=i;

err++;

if(err==2)cout<

fail"

elseif(err==0)cout<

matched"

else{

inty=(j+1)/5+1;

intx=j%5+1;

cout<

'

('

x<

'

y<

)'

题目八:

每个人每天早上都要思考一个问题,这个问题的历史已经悠久得无法追溯,那就是:

今天午饭吃什么。

现在有个腻歪的人,他已经妥协于人工智能来解决日常问题,妄图找出吃饭问题的通解已知:

根据区域定位有以下地方可去:

范围1:

a品尝坊、b张三疯、c南区食堂

范围2:

d北区食堂、e咪哆

范围3:

f大小姐的店

根据远近程度和价格因素,希望一周5天去范围1的几率为20%,去范围2的几率为70%,去范围3的几率为10%(理论值)。

请写一段程序,随机输出15个字母(实际值),确定半个月的吃饭问题(不考虑跨平台)注意:

以上概率是指【如果】取输出个数趋近于无穷时的概率,而不是指15次*20%等式

四舍五入得到的输出结果。

windows.h>

//linux/dev/random

//#include<

ctime>

floatset_rand(){srand(time_t(time(NULL)));

//低精度取种,需循环辅助floatr=rand()%1000;

returnr/10;

//.000-.999

floatSetRand(){LARGE_INTEGERStart;

QueryPerformanceCounter(&

Start);

srand((long)Start.LowPart);

//高精度取种longRndNum=rand()%1000;

return(float)RndNum/1000;

//.000-.999}

intmain(){for(inti=0;

15;

i++){if(SetRand()<

=.2){if(SetRand()<

=1/3)cout<

a'

elseif(SetRand()>

2/3)cout<

c'

elsecout<

b'

elseif(SetRand()>

.9)cout<

f'

if(SetRand()<

=.5)cout<

d'

elsecout<

e'

}return0;

题目九:

约瑟夫是一名犹太历史学家。

他在自己的日记中写道,他和他朋友与39个战友(共41人)被罗马军队包围在洞中。

他们讨论是自杀还是被俘,最终决定自杀。

自杀规则规定,所有人围成一个圈,由一人开始报数,报到3的被杀死,下面的人继续从1报数,约瑟夫终和他的朋友活了下来。

问:

最初约瑟夫和他的朋友占据这个队伍的位置各为第几个?

无脑穷举,结果16、31#include<

ints=0;

//jmp3

intn[41];

41;

i++)n[i]=1;

j<

39;

if(i==41)i=0;

s+=n[i];

if(s==3){

s=0;

n[i]=0;

i++)if(n[i]==1)cout<

i+1<

题目十:

设计一个算法,计算输出1至这个自然数间‘1'

共出现了几次,如1-11间‘1'

出现了4次。

假设数在int范围内,不考虑效率。

(若算法效率足够高可先至14题)intcount(intn){

inti=0;

while(n!

=0){

i+=(n%10==1)?

1:

0;

n/=10;

returni;

intf(intn){

intc=0;

for(inti=1;

=n;

c+=count(i);

returnc;

题目十一:

(15分)

假设5*4的代表一个逆时针旋转的字母区域,输入长宽,打印一个类似的字母区域,乘积若

超过26继续由新一组的A、B、C……填充,不要求输出边框,例如5*4的样式如下:

ABCDE

NOPQF

MTSRG

LKJIH

cstring>

#defineN100

chara[N][N];

intdirection[4][2]={{0,1},{1,0},{0,-1},{-1,0}};

//左、右、下、上的顺序

//freopen("

in.txt"

"

r"

stdin);

inti,j,n,m,next_i,next_j,x,ch,count;

while(scanf("

%d%d"

&

n,&

m)!

=EOF)

{i=j=next_i=next_j=x=ch=count=0;

memset(a,'

'

sizeof(a));

while(count<

n*m)

a[i][j]='

+ch%26;

next_i=i+direction[x][0];

next_j=j+direction[x][1];

if(a[next_i][next_j]!

='

||next_i<

0||next_i>

=n||next_j<

0||next_j>

=m)

x=(x+1)%4;

//按顺序向其他方向next_i=i+direction[x][0];

ch++;

count++;

i=next_i;

j=next_j;

}for(i=0;

n;

i++)

{for(j=0;

m;

j++)printf("

%4c"

a[i][j]);

printf("

);

题目十二:

设计一个函数f($a,$b),其中“$a,$b”代替一个无限循环小数,$a为固定部分,$b为循环体。

要求输出一个“x/y”的最简分数表达这个有理数,并测试-13.14(135)=-48623/3700

intcal(intx,inty){

return(!

y)?

x:

cal(y,x%y);

}//辗转相除

voidf(floats,charloop[]){

intsign=1;

abs(s)==s?

NULL:

sign=-1;

longn3=0;

inti=0;

for(;

loop[i]!

\0'

i++)n3=loop[i]-'

0'

+n3*10;

//char[]tousignedlonglongm3=pow(10,(float)i)-1;

s=abs(s);

longn2=1,m2=1;

floattemp=s;

for(intj=0;

j++){

longdj=(long)temp;

if(temp==(long)dj)break;

temp=s*pow(10,(float)j);

m2=pow(10,(float)(j));

}n2=temp;

J

longm1=m2*(m2*m3);

longn1=n3*m2+n2*(m2*m3);

longh=cal(m1,n1);

m1/=h;

n1/=h*sign;

s*=sign;

("

loop<

)="

n1<

/"

m1<

intmain(){f(-13.14,"

135"

return0;

题目十三:

(15分)

输入4个坐标(前3个互不相同,且不共线),判断第4个点与前3个点所组成的三角形的位置关系(内、外、上)。

structpoint{

doublex,y;

};

doublelen(pointA,pointB){

returnsqrt(pow((A.x-B.x),2)+pow((A.y-B.y),2));

doublearea(pointA,pointB,pointC){//海伦公式

1/2*abs((A.x*B.y+B.x*C.y+C.x*A.y)-(A.x*C.y+B.x+A.y+C.x*B.y));

//vectordoublea=len(B,C);

doubleb=len(C,A);

doublec=len(A,B);

doublep=.5*(a+b+c);

returnsqrt((p-a)*(p-b)*(p-c)*p);

intflag(pointA,pointB,pointC,pointD){doubleABC=area(A,B,C);

doubleABD=area(A,B,D);

doubleACD=area(A,C,D);

doubleBCD=area(B,C,D);

endl<

ABD+ACD+BCD-ABC<

returnabs(ABD+ACD+BCD-ABC)>

=1E-5?

-1:

(ABD||ACD||BCD?

0);

/*

相加与ABC不等在ABC外,返回-1

此处表示ABD+ACD+BC与ABC误差超过10A-5,则说明在外由于double开根导致精度损失,如要克服可以用行列式算法相加与ABC相等,如果其中一个面积为0,则在线上,返回0

相加与ABC相等,如面积为0,则在ABC内,返回1

pointA,B,C,D;

A.x>

A.y;

B.x>

B.y;

C.x>

C.y;

D.x>

D.y;

flag(A,B,C,D)<

题目十四:

1至1,000,000,000间‘1'

共出现了几次(限制3s内)。

longf(longn){

longj(0),f

(1);

//counter,factor

longl

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

当前位置:首页 > 人文社科 > 法律资料

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

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