1、ACM软件大赛之编程大赛题目附部分答案ACM软件大赛之编程大赛比赛考前须知:比赛时间为3小时180分钟;比赛分两个阶段:第一阶段限时30分钟,完成公示的3题,第二阶段限时150分钟事先完成第一阶段题目的小组可提前进入第二阶段;比赛第一阶段的3道题目将在前期宣传中告知参赛选手,比赛第二阶段的题目将由赛事主席当场公布竞赛题目;前两阶段题目分为三个分值5分、10分、15分,第一阶段3道公示题都为5分;第二阶段总共15道题,根据不同的难度分值不同,分别为5道5分题,5道10分题,5道15分题;第一阶段参赛队员不可参考任何相关资料;第二阶段参赛队员可以携带诸如书,手册,程序清单等参考资料。比赛过程中队员
2、不得携带任何电子媒质的资料;参赛者可以选择自己擅长的语言C,C+,JAVA等等进展编写考虑到大一和大二学生的知识掌握程度,大一参加选手一开场就会有10分的分数,最后总分是由所做题目及初始的10分相加得到。每组队员根据安排使用电脑,小组人数为两人的使用一台电脑,超过两人的使用两台电脑,每台的电脑配置完全一样;各小组每做完一题或几题,必须交予评委教师运行,评委教师当场给分;如在比赛中发现作弊等行为,将取消比赛资格。第一阶段公示题目:题目一:5分打印以以下图形,纵遵从字母顺序,行字符数遵从斐波那契数列ABCCDDDEEEEEFFFFFFFFGGGGGGGGGGGGG#includeint f(int
3、 x) int a = 1 , b = 0; int max_ = x; int sum = 0; for(int i = 0; i max_ ; i+) sum = a + b; a = b; b = sum; return sum;void loop_print(int num,char chr) for(int i = 0; i num ;i+) std:coutchr; std:coutn;int main() int line_max = 7; char chr = A; for(int line = 0; line line_max; line+) loop_print(f(lin
4、e+1),chr); chr+; return 0;题目二:5分有个电子钟,12点显示为12:00即12小时制,那么请问一天24时间,出现连续3个一样数字的钟点有几个?#includeusing namespace std;bool check(int time) int h=time/100; int m=time-100*h; return h=12&m0?true:false;/12小时制int main() int time=0; int j(0);/总计数器 while(time1270)/max 12:59 int t=time; int n4; for(int i=0;i4;i+
5、) ni=t%10; t /= 10; if(n1=n2&(n0=n1|n3=n1)&check(time) /coutn3n2:n1n0n;/test j+; time+; couttotal: j*2 endl;题目三:5分10进制的四位数中有几个符合如下特征:将其分别表示为16进制、10进制、12进制,在每种状态下,分别将各个位上的数相加,能得到3个相等10进制数。例如299210进制:2992 2+9+9+2 = 2212进制:1894 1+8+9+4 = 2216进制:BB0 11+11+0 = 222992-2999#include#includeusing namespace s
6、td;int convert(int n,int c) float high_p=0; int sum=0; int a4=0,0,0,0; for(int i=0;i+) float testN = pow(c,(float) i); if(n=testN)high_p=i; else break; for(int i=0;high_p!=-1;i+) ai=n/pow(c,high_p); n-=ai*pow(c,high_p); high_p-; for(int i=0;i4;i+)sum+=ai; return sum;int main() int j=0; for(int i=100
7、0;i=9999;i+) if(convert(i,16)=convert(i,10)&(convert(i,10)=convert(i,12) coutiendl; j+; coutj;return 0;第二阶段题目:题目一:5分不引入临时变量写出swap(a,b)功能void swap(int &a, int &b) a += b; b = a-b; a -= b;题目二:5分she分别代表3个数字,:(he)2=sheshe=?#includeint main() for(int he=15;he=96;he+) for(int s=1;s=9;s+) if(he*he=100*s+he
8、) std:couthe*heendl; return 0;题目三:5分有4条狗A、B、C、D,他们分别在一条100m的公路上步行,速率均为5m/s,A初始在30m处,B初始在65m处,C初始在75m处,D初始在95m处,初始左右方向是随意的,任意两狗相遇那么各自掉头掉头时间不计,速率保持5m/s。请问,4条狗最终都离开公路的最大时间是几秒?#includeint main() std:cout95/5; return 0;题目四:5分Big Bang 中的高级石头剪刀布问题Scissors - Paper Paper - RockRock - ScissorsRock - LizardLiz
9、ard - SpockSpock - ScissorsScissors - LizardLizard - PaperPaper - SpockSpock - Rock规那么是左边的手势赢右边的手势,现有玩家P1、P2,输入各自选择的手势,得出胜负。#include#includeusing namespace std;int main() int p2, p1; cout 1.Paper endl 2.Rock endl 3.Lizard endl 4.Spock endl 5.Scissors p1 p2; float n = p1 - p2; if (n * pow(-1, fabs(n)
10、 0)/此算法由yaozizi提供 cout p2 win; else if (n = 0) cout duce; else cout p1 win; return 0;题目五:5分游戏规那么:21根火柴,每次取1-4根,谁取走最后一根判输。现在人和计算机博弈,设计一个程序保证计算机必胜,要求每回合人与计算机各输入或返回一个代表取走火柴根数的数,直到游戏完毕。#includeusing namespace std;int main() int n=21; int p,c; while(n!=0) cinp; while(p4|p=0|n-p0) couterr, input againp; i
11、f(n!=0) if(n!=1)cout5-pendl; else cout=5)n-=5; 题目六:10分以下式子:2+3+4=91+2+3+4=10显然右边的数都能表示为nn2个连续自然数之和1开场,暂称之为囧数但似乎23、32等数都不能写成几个数之和的形式,所以它们不是囧数这里有个可行的判断方法为:上限为N,那么测试1+2+31+2+3+41+2+3+4+N2+3+42+3+4+N(N-2)+(N-1)+N是否等于N这是一种可行但非常暴力的穷举实际上囧数还是有一些规律可循的,请设计一个优于之前提到的算法要求输入一个数,并判断它是否为囧数/*1.如果一个数能被奇数=3整除,那么必能写成X=
12、平均数*中间数的形式,所以是囧数2.如果一个数是合数,如果其中有奇数因子,那么回到1,为囧数;如果它是2的乘方,那么不是囧数 证明:它无法写成奇数个相加,因为除不尽奇数;也不能写成偶数个相加,中间数有两个,和必为奇数,这个奇数必然是欲判断数的一个因子3.如果一个数是素数,那么必须是6、10、14、18个数相加得来,这样才能得到奇数,根据高斯求和公式,这样的和必有奇数因子综上:只有2的乘方、素数、小于6的自然数,不是囧数*/#includeusing namespace std;bool check(long tar) bool flag = false; if(tar6)flag = false; else if(tar%2=0)/偶数是否是2的阶乘 while(tar%2=0)tar/=2; tar=1?flag=false:flag=true; else /奇数是否是素数 double end = tar; for(int i=3;itar; bool flag = check(tar); coutflag; return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1