山东科技大学OJ部分题目记答案.docx
- 文档编号:2858855
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:29
- 大小:79.01KB
山东科技大学OJ部分题目记答案.docx
《山东科技大学OJ部分题目记答案.docx》由会员分享,可在线阅读,更多相关《山东科技大学OJ部分题目记答案.docx(29页珍藏版)》请在冰点文库上搜索。
山东科技大学OJ部分题目记答案
lf%.2lf%.2lf\n",a,b,c);
printf("%.2lf%.2lf%.2lf\n",d,e,f);
}
d%.3o%.3x\n",x,x,x);
printf("%.3d%.3o%.3x\n",y,y,y);
printf("%.3d%.3o%.3x\n",z,z,z);
}
ProblemA:
简单的打折计算
Description
商店规定:
消费满n元,可以打八八折。
设某件商品标价m元,输入购买的件数x,计算出需要支付的金额(单位:
元),精确到分。
Input
输入只有一行,三个整数m、n和x,且0 Output 输出金额,精确到分。 SampleInput 953004 SampleOutput HINT 了解浮点型的输出控制,注意整型和浮点型混合运算过程中的数据类型转换。 #include<> intmain() {intm,n,x; floats; scanf("%d%d%d",&m,&n,&x); if(m*x>=n) s=m*x*; else s=m*x; printf("%.2f",s); } ProblemC: 水仙花数 Description 如果一个三位十进制数等于其各位数字的立方和,则称这个数为水仙花数。 如: 13+53+33=153。 Input 一个整数x,100<=x<=999。 Output x是水仙花数,则输出“YES”,否则为“NO”。 #include<> intmain() { intx,a,b,c; scanf("%d",&x); a=x%10; b=x/10%10; c=x/100; if(a*a*a+b*b*b+c*c*c==x) printf("YES"); else printf("NO"); } ProblemA: 多少张钞票 Description 客户去商店买东西时,不超过100美金的账单喜欢用现金支付。 商店喜欢用最少的钞票给付客户的找零。 请你编写一个程序帮助商店计算出: 当客户买了x元商品给了一张100美元的钞票后,商店应该付给客户多少张20美元、10美元、5美元和1美元的钞票,使得钞票总数最少。 假设不存在其他面值的钞票,也不会有几角几分的价格,商店的各种钞票总是够用的。 Input 输入一个整数x,0 Output 按顺序输出20美金、10美金、5美金和1美金面值的钞票张数。 输出格式见sample。 SampleInput 7 SampleOutput $20bills: 4 $10bills: 1 $5bills: 0 $1bills: 3 #include<> intmain() {intx,s,a,b,c,d; scanf("%d",&x); s=100-x; a=s/20; b=(s-20*a)/10; c=(s-20*a-10*b)/5; d=s-20*a-10*b-c*5; printf("$20bills: %d\n",a); printf("$10bills: %d\n",b); printf("$5bills: %d\n",c); printf("$1bills: %d\n",d); } ProblemB: 自动拨出电话的程序 SampleInput (0532)621-15486 SampleOutput 0015486 HINT 这是个可以用scanf()解决的问题,请注意电话号码都是数字这个规律。 #include<> intmain() { inta,b,c; scanf("(0%d)%d-%d",&a,&b,&c); printf("0086%d%d%d",a,b,c); } .+n= Description 给定一个n,求出s=1+2+3+...+n的值。 Input 输入只有一行,包含一个正整数n(n<=232)。 Output 输出一行,为1+2+...+n的值。 SampleInput 10 SampleOutput 55 HINT n的数据范围大,需注意数据类型的选择和计算次序,以避免数据溢出。 #include<> intmain() { unsignedlonglongintn,s,i; scanf("%llu",&n); if(n%2==0) s=n/2*(n+1); else s=(n+1)/2*n; printf("%llu",s); } Theminimumnumberis-1. #include<> intmain() { inti,n,m,max,min; scanf("%d%d",&n,&max); min=max; for(i=1;i {scanf("%d",&m); if(m>max) max=m; if(m min=m;} printf("Themaximumnumberis%d.\nTheminimumnumberis%d.",max,min); } ProblemC: 成绩的等级 Description 把百分制的考试成绩转换成五级制的成绩: 90~100: Excellent 80~89: Good 70~79: Average 60~69: Pass 0~59: Failing 不在0~100之间的输入是非法数据,输出“Error”。 Input 输入多行,每行一个整数。 Output 输入所对应的成绩等级。 #include<> #include<> #include"" intmain() { intn; while(scanf("%d",&n)! =EOF) { if(n==100) printf("Excellent\n"); elseif(n<0||n>100) printf("Error\n"); else switch(n/10) {case9: printf("Excellent\n");break; case8: printf("Good\n");break; case7: printf("Average\n");break; case6: printf("Pass\n");break; default: printf("Failing\n"); } } return0; } ;否则输出“No.”。 HINT 首先要考虑如何去除空白符(空格、回车、换行、制表符等),标点和各种符号(如“,! "”和“#@<>{}”等),并且把串中的英文字符统一大小写,最后才能进行回文判定。 请注意,用gets()和scanf()判断文件尾的方法是不一样的。 gets()函数的返回值请查阅C语言的语法手册。 #include<> #include<> #include<> intmain() { inti,j,k; chara[1001],b[1001]; while(gets(a)! =NULL) { for(i=0,j=0;a[i]! ='\0';i++) { if(isalnum(a[i])! =0) { b[j]=a[i]; j++; } } for(i=0,k=0;i { if(tolower(b[i])==tolower(b[j-1-i])) k++; } if(k==ceil(j/) printf("Yes.\n"); else printf("No.\n"); } } ProblemD: MatrixProblem: ArrayPratice Description 求一个m×n阶矩阵A的转置矩阵AT。 矩阵A的每个元素都在int类型的范围之内。 Input 输入的第一行为一个整数M(M>0),后面有M组输入数据。 每组数据以两个正整数m和n开始,满足0 Output 输出为多组,每组输出A的转置矩阵AT。 矩阵的输出为: 每行两个元素之间用一个空格分开,每行最后一个元素之后为一个换行,在下一行开始输出矩阵的下一行。 每两组输出之间用一个空行分隔开。 SampleInput 1 33 123 456 789 SampleOutput 147 258 369 HINT 二维数组存储矩阵。 #include<> intmain() { inti,j,c,d,m,n; inta[100][100],b[100][100]; scanf("%d",&c); for(d=0;d {scanf("%d%d",&m,&n); for(i=0;i for(j=0;j scanf("%d",&a[i][j]); for(i=0;i {for(j=0;j if(j==m-1) printf("%d",a[j][i]); else printf("%d",a[j][i]); printf("\n"); } printf("\n"); } } ProblemA: 编写函数maxValue(编程题) Description 编写一个函数maxValue,求三个整数的最大值,其原型为: intmaxValue(inta,intb,intc); 其中a、b、c是参与比较的三个整数,返回值是三个数的最大值。 Input 输入三个int类型的整数,两两之间用空格隔开。 Output 输出三个整数的最大值。 SampleInput 123 SampleOutput 3 HINT AppendCode #include<> intmaxValue(inta,intb,intc) { intx; x=a>ba: b; if(x x=c; returnx; } intmain() { intx,y,z; scanf("%d%d%d",&x,&y,&z); printf("%d",maxValue(x,y,z)); return0; } ProblemB: 编写函数myFloor和myCeil(编程题) 取整函数有四个,分别是fix,floor,ceil,round。 这里要求你编写myFloor和myCeil函数,它们的原型分别是: intmyFloor(doubledata); intmyCeil(doubledata); 其中myFloor函数的结果是不大于data的最大整数,myCeil函数的结果是不小于data的最小整数。 注意: 不能使用和两个头文件。 Input 输入有多行,每行是一个需要转换的实数。 Output 输出为多行,与上述输入一一对应。 每行先输出floor函数的结果,再输出ceil函数的结果。 两者之间用一个空格隔开。 取整之后的结果不超出int类型的表示范围。 SampleInput 2 SampleOutput 12 -2-1 22 HINT AppendCode #include<> intmyFloor(doubledata) {inti; if(data>0) for(i=0;;i++) {if(data-i>=0&&data-i<1) break; } else for(i=0;;i--) {if(i-data<=0&&i-data>-1) break; } returni; } intmyCeil(doubledata) { inti; if(data>0) for(i=0;;i++) {if(i-data>=0&&i-data<1) break; } else for(i=0;;i--) {if(data-i<=0&&data-i>-1) break; } returni; } intmain() { doubledata; while(scanf("%lf",&data)! =EOF) { printf("%d%d\n",myFloor(data),myCeil(data)); } return0; } ProblemC: 求字符串的长度(编程题) Description 编写一个求字符串长度的函数,其原型如下: intstrlen(charstr[]); 其中str[]表示待求长度的字符串,返回值是str[]的长度。 注意: 主函数已经给出,只需提交strlen()函数及必要的头文件包含命令。 Input 输入为多行。 第一行N>0表示有N个测试用例,后面有N行,每行包含一个字符串(不超过1000个字符)。 Output 输出为多行,每行对应于一个测试用例。 每行的格式为: casei: lenght=j. 其中i表示测试用例编号(从1开始),j表示相应的字符串长度。 #include<> intstrlen(charstr[]) { inti; for(i=0;str[i]! ='\0';i++); returni; } intmain() { inti,N; charstr[1001]; scanf("%d",&N); getchar(); gets(str); printf("case1: length=%d.",strlen(str)); for(i=2;i<=N;i++) { gets(str); printf("\ncase%d: length=%d.",i,strlen(str)); } return0; } ProblemB: 你交换了吗之二(函数) Description 从标准输入读取两个整数,按先小后大的次序输出,并且输出是否交换过位置。 注意: a和b相等时不产生交换。 请注意阅读里的代码! Input 两个较小的整数a,b,用空格分开。 Output 输出有两种情况: 1)“abNO”,当a,b没有交换过 2)“baYES”,当a,b交换过 SampleInput 53 SampleOutput 35YES #include<> intis_swapped(int*p1,int*p2) { if(*p1>*p2)return1; elsereturn0; } intmain() {inta,b; scanf("%d%d",&a,&b); if(is_swapped(&a,&b)) printf("%d%dYES",b,a); else printf("%d%dNO",a,b); } ProblemC: 编写函数unionSet(编程题) Description 编写一个函数unionSet,对2个集合求并集。 其原型为: intunionSet(intsetA[],intsetB[],intnumA,intnumB); 其中setA和setB是两个待合并的集合,numA和numB分别是2个集合的元素个数。 该函数将两个集合合并后,放在数组setA中,返回值为并集中的元素个数。 Input 输入为2行,每行是一个集合,每行的输入以数值0作为结束,个数不超过100个。 2个集合合并后的元素取值均在[1,100]内。 Output 输出2个集合求并后的结果,两两之间用一个空格隔开。 输出时,先输出第一个集合中的元素,再输出从第2个集合中合并过来的元素。 见样例。 SampleInput 1234570 2468190 SampleOutput 1234576819 HINT AppendCode #include<> intunionSet(intsetA[],intsetB[],intnumA,intnumB) { inti,j,k,m=0; for(i=0;setB[i]! =0;i++) {k=0; for(j=0;j { if(setA[j]! =setB[i]) k++; } if(k==numA) { m++; setA[numA+m-1]=setB[i]; } } returnnumA+m; } intmain() { intsetA[101],setB[101],numA,numB,i; numA=numB=0; scanf("%d",&setA[numA]); while(setA[numA]! =0) { numA++; scanf("%d",&setA[numA]); } scanf("%d",&setB[numB]); while(setB[numB]! =0) { numB++; scanf("%d",&setB[numB]); } numA=unionSet(setA,setB,numA,numB); printf("%d",setA[0]); for(i=1;i printf("%d",setA[i]); return0; } ProblemA: 结构体的使用(编程题) Description 设有结构体定义如下: typedefstructStudent { charmajor[50];其中major表示学生的专业,name表示学生的姓名,totalScore表示该生的总分。 所有的标点符号均为半角字符。 SampleInput 3 ComputerTom1009889 InformationJack988987 ManagementMary898989 SampleOutput Computer,Tom: 287. Information,Jack: 274. Management,Mary: 267. HINT AppendCode #include<> typedefstructStudent { charmajor[50]; charname[50]; intscore[3]; }STU; voidprintInfo(STUstudents[],intnum) { inti,j; ints; for(i=0;i { s=0; for(j=0;j<3;j++) s+=students[i].score[j]; printf("%s,%s: ",students[i].major,students[i].name); printf("%d.\n",s); } } intmain() { inti,N; scanf("%d",&N); STUstus[N]; getchar(); for(i=0;i { scanf("%s%s",stus[i].major,stus[i].name); scanf("%d%d%d",&stus[i].score[0],&stus[i].score[1],&stus[i].score[2]); } printInfo(stus,N); return0; } ProblemB: 谁能上春晚(编程题) Description 科大电视台将在2013年2月10日举办一场大型春节晚会。 为了选拔好节目,科大电视台将于近日举办一次“直通科大春晚”的节目,届时将有M名选手和N名评委参加,并选拔排名前三甲的选手参加春晚。 选手的排序原则是: 对每名选手,N个评委的评分需要去掉一个最高分和一个最低分,然后求其平均分,按照平均分进行递减排序。 假定任意2名选手的平均得分都不相同。 现在,已知每位评委给每名参数选手的评分,需要你来编写一个程序,输出能够参加春晚的三名选手的名字和得分。 为方便起见,本题要用到如下结构体定义: typedefstruct { intscore[10];ame); for(j=0;j scanf("%d",&peo[k].score[j]); } return0; } intsort(Choicepeo[],intM,intN) { intj,k,a,b,m,n; doubles; Choicet; for(k=0;k { s=a=b=peo[k].score[0]; for(j=1;j { if(peo[k].score[j]>a) a=peo[k].score[j]; if(peo[k].score[j] b=peo[k].score[j]; s+=peo[k].score[j]; } s=s-a-b; peo[k].aver=s/(N-2); } for(m=1;m for(n=0;n if(peo[n].aver { t=peo[n]; peo[n]=peo[n+1]; peo[n+1]=t; } return0; } intmain() { Choicepeoples[30]; intM,N,i; scanf("%d%d",&M,&N); inputChoice(peoples,M,N); sort(peoples,M,N); for(i=0;i<3;i++) printf("%s%.2lf\n",peoples[i].name,peoples[i].aver); return0; } #include<> intmain() {intarray[1000],N,i,min,minIndex; scanf("%d",&N); for(i=0;i scanf("%d",&array[i]); min=array[0];minIndex=0; for(i=1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 山东 科技大学 OJ 部分 题目 答案