软件大赛试题2含答案.docx
- 文档编号:12646403
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:23
- 大小:22.09KB
软件大赛试题2含答案.docx
《软件大赛试题2含答案.docx》由会员分享,可在线阅读,更多相关《软件大赛试题2含答案.docx(23页珍藏版)》请在冰豆网上搜索。
软件大赛试题2含答案
第一题(郭玲,3分)
神秘的三位数
有这样一个三位数,组成它的3个数字阶乘之和正好等于它本身。
即:
abc=a!
+b!
+c!
下面的程序用于搜索这样的三位数,请补全缺失的代码。
//功能:
寻找三位神秘数
//时间:
2012310
//编辑人:
郭玲
#include"stdafx.h"
#include"stdio.h"
voidmain()
{
intJC[]={1,1,2,6,24,120,720,5040,40320,362880};
inti;
for(i=100;i<1000;i++)
{
intsum=0;
intx=i;
while(__x>0____)
{
sum+=JC[x%10];
x/=10;
}
if(i==sum)
{
printf("%d\n",i);
}
}
}
第二题:
(邓中强,4分)
歌赛新规则:
歌手大赛的评分规则一般是去掉一个最高分,去掉一个最低分,剩下的分数求平均。
当评委较少的时候,如果我们只允许去掉一个分数,该如何设计规则呢?
有人提出:
应该去掉与其余的分数平均值相差最远的那个分数。
即“最离群”的分数
以下的程序用于实现这个功能。
其中x存放所有评分,n表示数组中元素的个数。
函数返回最离群的那个分数值。
请补全缺失的代码。
#include
doublescore(doublex[],intn);
voidmain()
{
inti,n;
doublex[10];
printf("请输入评委人数:
");
scanf("%d",&n);
for(i=0;i { printf("请输入第%d个评委的分数: ",i+1); scanf("%lf",&x[i]); } printf("%lf\n",score(x,n)); } doublescore(doublex[],intn) { inti,j; doubledif=-1; doublebad; doublet; for(i=0;i { doublesum=0.0; for(j=0;j if(i! =j)//(i>j)||(i sum+=x[j]; t=x[i]-sum/(n-1); if(t<0)t=-t; if(t>dif) { dif=t; bad=x[i]; //printf("%d,%lf\n",i,x[i]); } } returnbad; } 第三题(童新,4分) 反转码 我们把“CBA”称为“ABC”的反转码。 下面是代码可以把BUF的字符反转,其中N表示BUF中待反转的串的长度,请补充缺少的代码。 #include voidrevers_str(char*buf,intn) { if(n<2)return; chartmp=buf[0]; buf[0]=buf[n-1]; buf[n-1]=tmp; revers_str(_buf+1,n-2__); } voidmain() { chararr[]={'1','2','3','4'}; revers_str(arr,4); printf("%s",arr); } 第四题(胡志亮,,5分) n进制小数 将任意十进制正小数跟别转换成2,3,4,5,6,7,8,9进制正小数,小数点后保留8位,并输出。 例如十进制小数位0.795,则输出: 十进制正小数0.795000转换成2进制数为: 0.11001011 十进制正小数0.795000转换成3进制数为: 0.21011011 十进制正小数0.795000转换成4进制数为: 0.30232011 十进制正小数0.795000转换成5进制数为: 0.34414141 十进制正小数0.795000转换成6进制数为: 0.44341530 十进制正小数0.795000转换成7进制数为: 0.53645364 十进制正小数0.795000转换成8进制数为: 0.62702436 十进制正小数0.795000转换成9进制数为: 0.71348853 以下代码提供了这个功能。 其中,dTestNo表示待转的十进制小数。 iBase表示进制数。 请填写缺失的部分。 #include voidfun(doubledTestNo,intiBase) { intiT[8]; intiNo; printf("十进制正小数%f转换成%d进制数为: ",dTestNo,iBase); for(iNo=0;iNo<8;iNo++) { dTestNo*=iBase; iT[iNo]=___(int)dTestN0_____________; if(___dTestN0>=1______)dTestNo-=iT[iNo]; } printf("0."); for(iNo=0;iNo<8;iNo++)printf("%d",iT[iNo]); printf("\n"); } voidmain() { doubledTestNo=0.795; intiBase; for(iBase=2;iBase<=9;iBase++) fun(dTestNo,iBase); printf("\n"); } 第五题(邱育武,6分) 字符串abcd经过一次轮转后为dabc此时位移记作1 字符串abcd进过两次轮转后为cdab此时位移记作2 以下代码为求字符串S,经过n次位移后的新字符串,请补全缺失的代码。 #include"stdafx.h" #include #include #include voidshift(char*s,intn); voidmain() { printf("kong"); shift("abcd",2); } voidshift(char*s,intn) { char*p; char*q; intlen=strlen(s);//求串s的长度 if(len==0) return; if(n<=0||n>=len) return; char*s2=(char*)malloc(__________); p=s; q=s2+n%len; while(*p) { *q++=*p++; if((q-s2)>=len) { *q=_________ q=s2; } } strcpy(s,s2);//把串s2里的内容复制给s printf("%s",s2); free(s2);//释放s2 } 第六题(黄德萍,9分) 某抽奖活动的规则是: 每位参与者在纸上写下一个8位数的号码。 最后通过摇奖的办法随机产生一个8位数字。 参与者写下的数字中最多有多少个连续与开奖号码中的相同,则称为中了几个号。 例如: 小张写的数字是: 12345678,而开奖号码是: 42347856.则称小张中了3个号,因为其中最长的相同连续位是: “234”。 如果小张写的是: 87654321,则他只中了一个号。 下面的代码根据传入的参数,返回中了几个号。 其中: a表示被评价的号码,b表示摇号产生的数字,请填写缺少的代码。 intg(inta,intb) { charsa[]="00000000"; charsb[]="00000000"; intn=0; inti,j; sprintf(sa,"%8d",a); sprintf(sb,"%8d",b); for(inti=0;i<8;i++) { for(j=1;j<=8-i;j++) { chart=_sa[i+j]_______; sa[i+j]=0; if(strstr(sb,sa+i)) { if(j>n)___n=j___; } sa[i+j]=t; } } returnn; } 第七题(孔华中,10分) 概率问题 某个袋子中有红球m个,白球n.现在要从中取出x个球.那么红球数目多于白球的概率是多少呢? 下面的代码解决了这个问题.其中的y表示红球至少出现的次数. 这与前文的问题是等价的.因为如果取出30个球,要求红球数大于白球数,则等价于至少取出16个红球.请根据仅存的线索,判断程序逻辑,并补全缺省的代码. /* m: 袋中红球的数目 n: 袋中白球的数目 x: 需要取出的数目 y: 红球至少出现的次数 */ doublepro(intm,intn,intx,inty) { if(y>x)return0; if(y==0)return1; if(y>m)return0; if(x-n>y)return1; doublep1=________________; doublep1=________________; return(double)m/(m+n)*p1+(double)n/(m+n)*p2; } 第八题 程序设计(王中玉,15分) 方阵的主对角线之上的称为“上三角”。 请你设计一个用于填充N阶方阵的上三角区域的程序。 填充的规则是: 使用1,2,3……的自然数列,从左上角开始,按照顺时针方向螺旋填充。 例如: 当N=3时,输出: 123 64 5 当N=4时,输出: 1234 9105 86 7 当N=5时,输出: 12345 1213146 11157 108 9 程序运行时。 要求用户输入整数N(3``20) 程序输出: 方阵的上三角部分。 要求格式: 每个数据的宽度为4,右对齐。 #include voidmain() { intn=0; inti=0; intj=0; inta=1; ints[100][100]; scanf("%d",&n); for(i;i { for(j=i;j for(j=i+1;j for(j=n-2*i-2;j>i;j--)s[j][i]=a++; } for(i=0;i { printf("\n"); for(intj=0;j printf("%5d",s[i][j]); printf("\n"); }scanf("%d",&n); } 第九题(赵丽津,16分) 9.程序设计 公司发了某商店的购物券1000元,限定只能购买店中的M种商品,每种商品的价格分别为M1,M2.......,要求程序列出所有的正好能消费完该购物券的不同购物方法.程序输入: 程序输入: 第一行是一个整数M,代表可购买的商品的种类数. 接下来是M个整数,每个1行,分别代表这M种商品的单价. 程序输出: 第一行是一个整数,表示共有多少种方案 第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔. 例如: 输入: 2 200 300 则应输出: 2 22 52 输入: 2 500 800 则应输出: 1 20 #include"stdafx.h" #include"stdio.h" #include intnGoodsType=0;//输入的商品的种类数 int*na; int*nb; intnCount=0;//方案数 voidprint() { inti; for(i=0;i printf("%d",nb[i]); printf("\n"); }//若条件不足,则以输出0来填充 voidproblem(intnTotal,intnSize);//声明 voidmain() { intni,nj; printf("Pleaseinputthenumbersofthisgoods: \n"); scanf("%d",&nGoodsType);//输入商品的种类数 na=(int*)malloc(sizeof(int)*nGoodsType); nb=(int*)malloc(sizeof(int)*nGoodsType);//a,b都被分配nGoodsType*4个字节的内存空间,且都指向每一个内存单元. //等价于定义一个nGoodsType*4个字节的内存空间的数组 printf("Pleaseinputtheunit-price: \n"); for(ni=0;ni { scanf("%d",&na[ni]);//na[]存放输入的商品的单价 } for(nj=0;nj { nb[nj]=0;//b[]数组均被赋值为0 } problem(1000,0); printf("%d",nCount); } voidproblem(intnTotal,intnSize) { if(nSize! =nGoodsType)//相同于数组,下标从0开始 { if(nTotal==0)//判断背包是否正装满 { nCount++;//存放可行方案的个数 print();//输出此可行解 } else { problem(nTotal,nSize+1);//未放入物品a【size】的情况 if(nTotal-na[nSize]>=0)//判断放入a【size】后,是否会超出背包的承载 { nb[nSize]++;//使得a【size】对应物品的数量加1 problem(nTotal-na[nSize],nSize); nb[nSize]--;//使得相应的物品数量减1 } } } } 第十题(李杰,28分) 10.程序设计(李杰) 一种playfair密码变种加密方法如下: 首先选择一个密钥单词(称为pair)(字母不重复,且都为小写字母),然后与字母表中其他字母一起填入到一个5*5的方阵,填入方法 1.首先按行填入字符串。 2.紧接其后,按字母序列填入不在密钥串的字母; 3.由于方阵中只有25个位置,最后剩下的那个字母则不需交换。 4.如果密钥为youandme,则该方阵如下: youan dmebc fghij klpqr stvwx 在加密一对字母时,如am,在方阵中找到以这两个字母为为顶点的矩形为: oua meb 这对字母的加密字母为该矩形的另一顶点,如本例中为ob。 请设计程序,使用上述方法对输入串进行加密,并输出加密后的字符串。 另有如下规定: 1.一对一对取字母,如果最后只剩下一个字母,则不交换,直接放入加密串中; 2如果一对字母中的两个字母相同,则不变化,直接放入加密串中; 3.如果一对字母中有一个字母不在矩形中,则不交换,直接放入加密串中; 4.如果字母对出现在方阵中的同一行或同一列,如df或hi,则只需简单对调这两个字母,即变化为fd或ih; 5.如果在矩形中能够找到以字母为顶点的矩形,例如字母对am.则该矩形的另一对顶点字母中,与a同行的字母应在前面,在上例中应是ob;同样若待变换的字母对为ta,则变换后的字母对应是wo; 6.本程序中输入串均为小写字母,并不含标点、空格或其他字符; 解密方法与加密方法相同,即对加密后的字符串再加密,将得到原字符串; 要求输入形式如下: 从控制台输入两行字符串,第一行为密钥单词(长度小于或等于25),第二行为待加密字符串(长度小于等于50),两行字符串尾部都有一个回车换行符,并且两行字符串均为小写字母,不含其他字符。 在标准输出上输出加密后的字符串。 例如,如输入: youandme Welcometohangzhou 则表示输入的单词密钥为youandme,形成的正方形如上所示;待加密字符串为welcometohangzhou。 再矩形中可以找到以第一对字母we为顶点的矩形,对应的另一对顶点字母为vb,因此加密后为vb,同理可找到与字母对lc、et、oh、ho对应的顶点字母对,而字母对om位于上述矩形中的同一列,所以直接以颠倒这两个字母来加密,即为mo,字母对an同理。 字母对gz中的z不在上述矩形中,因此原样放入加密串中,最后剩下一个字母u也原样输出. 因此输出的结果为: vbrmmomvugngzaguu编程实现此功能。 代码如下: /* 程序的功能: 对输入的字符串进行加密 程序的编写日期: 2012年3月4日 */ #include #include #include voidfun(charp[][5],char*q)//形成加密矩阵 { chartemp='a'; char*tp=q; for(inti=0;i<5;i++) for(intj=0;j<5;j++) { if(*tp) { p[i][j]=*tp; tp++; } else { for(;temp<'z';temp++) { for(intt=0;q[t];t++) { if(q[t]! =temp) continue; break; } if(! q[t]) { p[i][j]=temp; temp++; break; } } } } } voidopertion(char*p,chary[][5]) { char*q=p; inta1=-1,a2=-1;//用来存储横坐标 intb1=-1,b2=-1;//用来存储纵坐标 inti,j,t; chartemp; if(strlen(p)%2==0) for(t=0;t if(p[t]! =p[t+1])//判断两字母是否相同 { for(i=0;i<5;i++) for(j=0;j<5;j++) { if(p[t]==y[i][j]) { a1=i; b1=j; } elseif(p[t+1]==y[i][j]) { a2=i; b2=j; } } if(a1==-1||a2==-1)//其中有一个没有找到 continue; if(a1>=0&&a2>=0)//代表找到了这对不相同的字母所对应的密钥串的位置 if(a1! =a2&&b1! =b2)//横坐标不相同并且纵坐标不相同 { p[t]=y[a1][b2]; p[t+1]=y[a2][b1]; a1=-1;//a1,a2初始化便于之后的比较 a2=-1; } /**********横坐标相同或纵坐标相同对调位置**************************/ else if(a1==a2||b1==b2) { temp=p[t]; p[t]=p[t+1]; p[t+1]=temp; a1=-1; a2=-1; } } /**********两字母相同不做任何改变**************************/ if(strlen(p)%2! =0)//字符串的个数为奇数时 { for(t=0;t<(strlen(p)-1);t+=2) if(p[t]! =p[t+1])//判断两字母是否相同 { for(i=0;i<5;i++) for(j=0;j<5;j++) { if(p[t]==y[i][j]) { a1=i; b1=j; } elseif(p[t+1]==y[i][j]) { a2=i; b2=j; } } if(a1==-1||a2==-1)//其中有一个没有找到 continue; if(a1>=0&&a2>=0)//代表找到了这对不相同的字母所对应的密钥串的位置 if(a1! =a2&&b1! =b2)//横坐标不相同并且纵坐标不相同 { p[t]=y[a1][b2]; p[t+1]=y[a2][b1]; a1=-1;//a1,a2初始化便于之后的比较 a2=-1; } /**********横坐标相同或纵坐标相同对调位置**************************/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 大赛 试题 答案