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