山东科技大学C语言作业四

更新时间:2023-11-28 11:20:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Problem A: 只有一个二元运算符的表达式运算

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 5044 Solved: 1937 [Submit][Status][Web Board]

Description

编程序读入并计算只有一个二元运算符的表达式的值。用到的二元运算符有:“+”、“-”、“*”、“/”、“%”,与C语言的语法一致。

Input

每行输入一个表达式,格式为:二个整型的操作数a和b,中间用一个符号分开,这个符号就是运算符。测试样例不存在除数为0的情况。 输入以a和b为0,且用一个空格分开结束。

Output

每行对应输入的运算符为“+”、“-”、“*”、“/”、“%”,则计算a+b、a-b、a*b、a/b、a%b的值;否则输出“invalid op”。

Sample Input

33+5 8*9 2.2 1-6 17/3 9%3 0 0

Sample Output

38 72 invalid op -5 5 0

#include #include void main() {

int i,a,b; char c;

for(i=0;i<=100;i++)

{for(;scanf(\ if(a==0&&c==' '&&b==0) goto loop; else

switch(c) {

case'+':

printf(\ break; case'-':

printf(\ break; case'*':

printf(\ break; case'/':

printf(\ break; case'%':

printf(\ break; default:

printf(\

} } loop: i=101; }

Problem B: 摄氏——华氏温度转换表

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 6632 Solved: 1711 [Submit][Status][Web Board]

Description

已知华氏温度F,转换为摄氏温度C的公式为C=(F-32)*5/9。

输出给定范围(从low到high)和步长(step)的摄氏——华氏温度转换表

Input

第1行若为“C->F”表示输出:摄氏——华氏温度转换表,若为“F->C”表示输出:华氏——摄氏温度转换表。

第2、3行为两个整数:high和low,其值在-100到200之间。 第4行为step,step精确到小数点后1位。

Output

输出第一行为C和F,分别表示摄氏和华氏,与小数点对齐。若输出摄氏——华氏温度转换表,则C在前、F在后;反之,则输出华氏——摄氏温度转换表。

从输出的第2行开始为从温度low到温度high(包括low和high)的转换表,温度输出精确到小数点后1位,表格被“->”分为两个宽度相同的部分,其它的测试样例也不会给出超出宽度的数据,格式详见sample。

Sample Input

C->F -10

40 2.5

Sample Output

C -> F -10.0 -> 14.0 -7.5 -> 18.5 -5.0 -> 23.0 -2.5 -> 27.5 0.0 -> 32.0 2.5 -> 36.5 5.0 -> 41.0 7.5 -> 45.5 10.0 -> 50.0 12.5 -> 54.5 15.0 -> 59.0 17.5 -> 63.52 20.0 -> 68.0 22.5 -> 72.5 25.0 -> 77.0 27.5 -> 81.5 30.0 -> 86.0 32.5 -> 90.5

35.0 -> 95.0 37.5 -> 99.5 40.0 -> 104.0

HINT

输出格式可以通过sample分析出来,因为两栏的总宽度是固定的。一个隐藏的陷阱是step是浮点数,某些浮点数是无法精确存储的,因此经过一定量的计算后这个误差会影响到浮点数的相等性判断,需要加上精度控制。

Append Code

[Submit][Status][Web Board]

#include int main() {

double low,high; double step,c,f; char ch1,ch2;

scanf(\ if(ch1=='C'&&ch2=='F') {

scanf(\ f=(double)9/5*low+32; if(low==-100||f<=-100) {

printf(\ C -> F\ while(low<=high+0.01) {

f=low*9.0/5.0+32;

printf(\ low+=step; }

return 0; }

printf(\ C -> F\ while(low<=high+0.01) {

f=low*9.0/5.0+32;

printf(\

low+=step; }

return 0; }

else if(ch1=='F'&&ch2=='C') {

scanf(\ c=(low-32)*((double)5/9); if(low==-100||c<=-100) {

printf(\ F -> C\ while(low<=high+0.01) {

c=(low-32)*5/9.0;

printf(\ low+=step; }

return 0; }

printf(\ F -> C\ while(low<=high+0.01) {

c=(low-32)*5/9.0;

printf(\ low+=step; }

return 0; } }

Problem C: 1!+2!+…+k!=?

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 5125 Solved: 1645 [Submit][Status][Web Board]

Description

求1!+2!+…+k!=?,并判断是否溢出。

Input

输入为一个正整数k。

Output

若1!+2!+…+k!的值溢出unsigned(无符号整型)的范围输出“overflow”,否则输出1!+2!+…+k!的结果。

Sample Input

5

Sample Output

153

HINT

如果一个值溢出某个变量的数据类型存储范围,但仍然存入该变量,那么存入该变量中的值实际上是什么?

Append Code

#include int main() {

int i,j;

unsigned int s,b,a; s=0;

scanf(\ b=1;

for(i=1;i<=j;i++) { a=b; b=b*i;

if((double)b/a

{ printf(\ return 0; }

s=s+b; }

printf(\ return 0; }

Problem D: 辗转相除法

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 3383 Solved: 1185 [Submit][Status][Web Board]

Description

辗转相除法,也称欧几里得算法,是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。

两个整数的最大公约数(亦称公约数)是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);因为252 ? 105 = 147,所以147和105的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至其中一个变成零。这时,所剩下的还没有变成零的数就是两数的最大公约数。

例如,计算a = 1071和b = 462的最大公约数的过程如下:从1071中不断减去462直到小于462(可以减2次,即商q0 = 2),余数是147: 1071 = 2 × 462 + 147.

然后从462中不断减去147直到小于147(可以减3次,即q1 = 3),余数是21: 462 = 3 × 147 + 21.

再从147中不断减去21直到小于21(可以减7次,即q2 = 7),没有余数: 147 = 7 × 21 + 0.

此时,余数是0,所以1071和462的最大公约数是21。

Input

输入为多行,每行有一对非负整数a,b,且a*b不会超出int类型的数据范围。输入至EOF结束。

Output

每行输出一对a,b的最大公约数和最小公倍数,顺序与输入对应。

从整除定义出发:若a整除b(b除以a没有余数),则b是a的倍数,a是b的约数,这里要求b不为0。因此0是任意整数的倍数(任意整数都是0的约数),但是0不能是约数。

Sample Input

1 1 2 3 2 2 3 2 4 6 7 5 12 6 18 9 24 36

Sample Output

1 1 1 6 2 2 1 6 2 12 1 35 6 12 9 18 12 72

HINT

按照题目描述所给的算法解题,注意以下几点:辗转相除法对两个数的大小关系有要求,根据倍数和约数的数学定义,一个非0数和0的约数是多少?辗转相除法的计算过程是符合这种定义的。

Append Code

[Submit][Status][Web Board] 错误:#include

int main()

{

int a,b,i,c;

for(;scanf(\

{ c=a*b; if(a==0&&b!=0) printf(\ else if(a!=0&&b==0) printf(\

else {

while(a!=b)

{ if(a>b) a=a-b; if(a

}

printf(\

} } }

正确:#include int main()

{ int a,b,c,m,t;

while(scanf(\ {

if(a==0&&b!=0)

printf(\ else if(a!=0&&b==0)

printf(\

else {

if(a

t=a; a=b; b=t; }

m=a*b; c=a%b; while(c!=0) {

a=b; b=c; c=a%b; }

printf(\ } } }

Problem E: Sum Problem (II) : Input/Output

Practice

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 2765 Solved: 1959 [Submit][Status][Web Board]

Description

计算若干整数的和,这些整数都是小于1000的非负整数。

Input

输入的第一行是一个整数M,后面有M个测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。

Output

每组测试样例对应一行输出,为所给的N个整数之和,顺序与输入对应。

Sample Input

2

3 1 2 3

5 10 15 20 30 50

Sample Output

6 125

HINT

用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。

Append Code

#include int main() {

int m,n,a,i,j,s; scanf(\ for(j=1;j<=m;j++) {

scanf(\ { s=0;

for(i=1;i<=n;i++) {

scanf(\ s=s+a; }

printf(\ } } }

Problem F: Sum Problem (III) : Input/Output

Practice

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 2521 Solved: 1817 [Submit][Status][Web Board]

Description

计算若干整数的和,这些整数都是小于1000的非负整数。

Input

输入为多行,每行为一组测试样例。每个测试样例以一个整数N开始,后面接着是N个整数。当输入的N为0时表示输入结束。

Output

每组测试样例对应一行输出,为所给的N个整数之和,顺序与输入对应。

Sample Input

3 1 2 30

5 10 15 20 30 50 0

Sample Output

6 125

HINT

用双重循环解决这个问题,外层循环控制用例的输入,内层循环控制读取N个整数。

Append Code

#include int main() {

int n,a,i,s;

for(;scanf(\ {

if(n==0) break; else { s=0;

for(i=1;i<=n;i++) {

scanf(\ s=s+a; }

printf(\ } } }

Problem G: 百钱买百鸡问题

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 4464 Solved: 800 [Submit][Status][Web Board]

Description

“百钱买百鸡”是我国著名的古代数学问题,中国古代数学家张丘建在他的《算经》中提出了这样一个问题:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?

你的任务是求解下面这个问题。问题是这样描述的:a文钱可买一只公鸡,b文钱可买一只母鸡,c文钱可买d只小鸡。用m文钱买n只鸡,那么有公鸡x只、母鸡y只、小鸡z只。求解出符合题意的x,y,z。

Input

输入为一张表。第一行是一个固定不变的表头,格式见sample。后面有多行,每行为一组测试数据。每组测试数据由6个整数组成,分别为“a,b,c/d,m,n”。满足0

Output

每组测试数据的运行结果输出为一张表,表头固定为“COCKS,HENS,CHICKS”。每组测试数据的一个可行解数出为一行,为三个整数:“x,y,z”。多组解按照公鸡数从少到多的顺序输出。若测试数据无解则输出“Cannot buy!”。两组测试数据之间用一个空行分隔开。

Sample Input

COCK,HEN,CHICK,MONEY,CHICKS 3,2,1/3,100,100 5,3,1/3,100,100 8,5,1/7,100,100 8,5,1/7,300,300

Sample Output

COCKS,HENS,CHICKS 0,40,60 5,32,63 10,24,66 15,16,69 20,8,72 25,0,75

COCKS,HENS,CHICKS 0,25,75 4,18,78 8,11,81 12,4,84

Cannot buy!

COCKS,HENS,CHICKS 8,40,252

HINT

本题重点在于了解多重循环的运行效率问题,减少一层循环可以降低很大规模的运算量。通过在循环体内加计数器可以统计出循环的运行次数,当测试数据变大时,运行次数的增长会非常可观,这就是超时的原因了。

Append Code

Eg:#include void main() {

int a,b,c;

for(a=1;a<20;a++) {

for(b=1;b<33;b++) {

for(c=3;c<100;c+=3)

{

if((a+b+c==100)&&(a*5+b*3+c/3==100)) printf(\ } } } }

答案:#include #include int main() {

char s[50];

long int a,b,m,n,x,y,z,flag; int c,d; gets(s);

while(scanf(\ {

flag=0;

for(x=0; x<=n; x++) {

if((((a-b)*x+b*n-m)*d)%(b*d-c)==0) {

z=(((a-b)*x+b*n-m)*d)/(double)(b*d-c); y=n-z-x;

if(fabs(a*x+b*y+z*c/(double)d-m)<0.000000001&&z*c%d==0&&x>=0&&y>=0&&z>=0) {

flag=1; } } }

if(flag==0)

printf(\ else {

printf(\ for(x=0; x<=n; x++) {

if((((a-b)*x+b*n-m)*d)%(b*d-c)==0) {

z=(((a-b)*x+b*n-m)*d)/(double)(b*d-c);

y=n-z-x;

if(fabs(a*x+b*y+z*c/(double)d-m)<0.000000001&&z*c%d==0&&x>=0&&y>=0&&z>=0) {

printf(\ } } } }

printf(\ }

return 0; }

Problem H: Print Graphics Problerm (II)

Time Limit: 1 Sec Memory Limit: 16 MB Submit: 2378 Solved: 845 [Submit][Status][Web Board]

Description

向标准输出上打印一些用ASCII字符组成的图形。

Input

输入为多个整数n,0

Output

若n为偶数,则输出一个正向的n层等腰三角形;n为奇数,则输出一个倒向的n层等腰三角形。三角形由“+”组成。任意两个图形之间有一个空行分隔,格式见sample。

Sample Input

5 4 0

Sample Output

+++++++++ +++++++ +++++ +++ + + +++ +++++ +++++++

HINT Append Code

[Submit][Status][Web Board]

???< 中文 ????? English ??? All Copyright Reserved 2010-2011 SDUSTOJ TEAM GPL2.0 2003-2011 HUSTOJ Project TEAM Anything about the Problems, Please Contact Admin:admin

#include int main() {

int n,i,j; while(n!=0) {

scanf(\ if(n%2==0&&n!=0) {

for(i=1;i<=n;i++) {

for(j=1;j<=n-i;j++) printf(\

for(j=1;j<=2*i-1;j++) printf(\ printf(\ } } else {

for(i=n;i>=1;i--) {

for(j=n-i;j>=1;j--) printf(\ for(j=2*i-1;j>=1;j--) printf(\ printf(\ } }

printf(\ }

return 0; }

Problem I: 编写函数:求三个整数的最大值 (Append

Code)

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 1995 Solved: 913 [Submit][Status][Web Board]

Description

求三个整数的最大值。

----------------------------------------------------------------------------- 编写一个函数maxValue()求三个整数的最大值。其原型为: int maxValue(int a,int b,int c);

功能:函数的三个参数传入a,b,c的值,返回其中最大值。 函数的调用格式见“Append Code”。

Input

输入三个int类型的整数,两两之间用空格隔开。

Output

输出三个整数的最大值。

Sample Input

1 2 3

Sample Output

3

HINT

参看系统首页上的“Append Code”使用说明,讨论版(Web Board)上也有。

Append Code

append.c, append.cc, [Submit][Status][Web Board]

???< 中文 ????? English ??? All Copyright Reserved 2010-2011 SDUSTOJ TEAM GPL2.0 2003-2011 HUSTOJ Project TEAM Anything about the Problems, Please Contact Admin:admin

#include

int maxValue(int a,int b,int c) {

int x;

x=a>b?a:b; if(x

int main() {

int x,y,z;

scanf(\ printf(\ return 0; }

正确:#include int maxValue(int a,int b,int c) {

if(a>b&&b>c) return a;

else if(b>a&&b>c) return b;

else if(c>a&&c>b) return c; }

Time Limit: 1 Sec Memory Limit: 2 MB Submit: 1064 Solved: 448 [Submit][Status][Web Board]

Description

判断给定的一个字符是否是元音字母(a,e,i,o,u)?

----------------------------------------------------------------------------- 用C语言实现:append.c中函数原型为 int is_vocals(char c);

功能:若c是元音字母返回1,否则返回0。 用C++实现:append.cc中函数原型为 bool isVocals(char c);

功能:若c是元音字母返回true,否则返回false。 函数的调用格式见“Append Code”。

Input

输入一个字母。

Output

如果是一个元音字母,则输出: It is a vocals. 否则输出: It is not a vocals.

Sample Input

a

Sample Output

It is a vocals.

HINT

参看系统首页上的“Append Code”使用说明,讨论版(Web Board)上也有。

Append Code

append.c, append.cc, [Submit][Status][Web Board]

???< 中文 ????? English ??? All Copyright Reserved 2010-2011 SDUSTOJ TEAM GPL2.0 2003-2011 HUSTOJ Project TEAM Anything about the Problems, Please Contact Admin:admin

#include int is_vocals(char c) {

if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u'||c=='A'||c=='E'||c=='I'||c=='O'||c=='U') return 1; else

return 0; }

Problem K: 编写函数:是否水仙花数? (Append

Code)

Time Limit: 1 Sec Memory Limit: 2 MB #include

int main()

{

int x,a,b,c;

Submit: 1219 Solved: 337 scanf (\

a=x;

b=x/10;

c=x/100;

if(a*a*a+b*b*b+c*c*c==x)

printf (\Yes, it is a daffodil.\

else

printf (\No, it is not a daffodil.\

}

[Submit][Status][Web Board]

Description

所谓水仙花数,是指一个三位的正整数,它的每个位上的数字的3次幂之和等于它本身。 ----------------------------------------------------------------------------- 用C语言实现:append.c中函数原型为 int is_daffodil(int n);

功能:若n是水仙花数,则返回1,否则返回0。 用C++实现:append.cc中函数原型为 bool isDaffodil(int n);

功能:若n是水仙花数返回true,否则返回false。 函数的调用格式见“Append Code”。

Input

一个正整数n。

Output

如果n是一个水仙花数,则输出: Yes, it is a daffodil. 否则,输出:

No, it is not a daffodil.

Sample Input

153

Sample Output

Yes, it is a daffodil.

HINT

参看系统首页上的“Append Code”使用说明,讨论版(Web Board)上也有。

Append Code

append.c, append.cc, [Submit][Status][Web Board]

???< 中文 ????? English ???

#include int is_daffodil(int n) {

int a,b,c; a=n/100;

b=(n-a*100)/10; c=n-a*100-b*10;

if(n==a*a*a+b*b*b+c*c*c&&n>=100&&n<=999) return 1; else

return 0; }

Yes, it is a daffodil.

HINT

参看系统首页上的“Append Code”使用说明,讨论版(Web Board)上也有。

Append Code

append.c, append.cc, [Submit][Status][Web Board]

???< 中文 ????? English ???

#include int is_daffodil(int n) {

int a,b,c; a=n/100;

b=(n-a*100)/10; c=n-a*100-b*10;

if(n==a*a*a+b*b*b+c*c*c&&n>=100&&n<=999) return 1; else

return 0; }

本文来源:https://www.bwwdw.com/article/ie1t.html

Top