北理工C语言答案

《北理工 C语言答案》

1 Hello world

让我们用C语言向世界问好。

最早的程序基本是这个样子的:

程序一:

#include

void main()

{

printf("Hello world.\n");

}

程序二:

#include

int main()

{

printf("Hello world.\n");

return 0;

}

上面的程序你任意模仿一个,看看是否可以通过?如果你能通过这个简单的程序,那就让我们继续完成后面的习题吧。

输入:无

输出:Hello world.

程序实例1:

#include

void main()

{

printf("Hello world.\n");

}

结果:

Hello world.

程序实例2:

#include

int main()

{

printf("Hello world.\n");

return 0;

}

结果:

Hello world.

1. Welcome to Beijing.

让我们来练习如何显示多行文字。

输出:就是下面的那段文字。

程序实例1:

#include"stdio.h"

int main()

{

printf("Welcome\n");

printf("to\n");

printf("Beijing.\n");

return 0;

}

结果:

Welcome

to

Beijing.

程序实例2:

#include

void main()

{printf("Welcome\nto\nBeijing.\n");

}

结果:

Welcome

to

Beijing.

1练习最简单的printf和scanf

printf函数和scanf函数是C语言中最常用的函数之一,下面让我们练习一下吧。输入:整型变量x的值。

输出:输出整型变量x对应的十进制、八进制和十六进制形式。

认真看看-1的八进制和十六进制输出,请想想是为什么。

程序实例1:

#include"stdio.h"

main()

{int x;

scanf("%d",&x);

printf("x=%d,x=%o,x=%x\n",x,x,x);

}

结果:

输入:-1

输出: x=-1,x=37777777777,x=ffffffff

#include "stdio.h"

void main()

{

long x;

scanf("%d",&x);

printf("x=%d,x=%o,x=%0x\n",x,x,x);

}

结果:

输入:292

输出:x=292,x=444,x=124

1 练习两个整数之间的运算

背景:基本练习。

输入:接受两个整数,每个整数之间使用空格分隔。例如输入格式为:123 444 输出:分别输出进行+、-、*、/、*之后的运行结果。

程序实例1:

#include

void main()

{int a,b,c,d,e,f,g;

scanf("%d %d",&a,&b);

printf("%d+%d=%d\n",a,b,c=a+b);

printf("%d-%d=%d\n",a,b,d=a-b);

printf("%d*%d=%d\n",a,b,e=a*b);

printf("%d/%d=%d\n",a,b,f=a/b);

printf("%d%%%d=%d\n",a,b,g=a%b);

}

结果:

输入:10 3

输出:

10+3=13

10-3=7

10*3=30

10/3=3

10%3=1

程序实例2:

#include

void main()

{int x1,x2,x3,x4,x5,a,b;

scanf("%d %d",&a,&b);

x1=a+b;

x2=a-b;

x3=a*b;

x4=a/b;

x5=a%b;

printf("%d+%d=%d\n%d-%d=%d\n%d*%d=%d\n%d/%d=%d\n%d%%%d=%d",a,b,x1,a,b,x2,a,b,x3,a,b ,x4,a,b,x5);

}

结果:

输入:123 444

输出:

123+444=567

123-444=-321

123*444=54612

123/444=0

123%444=123

1 学习打印你的第一个图形

背景:

我们已经学习了printf函数,这里给出了一个小程序,它运行的结果是输出一个由星号(*)组成的4*4的正方形。

程序如下:

#include

void main()

{

printf("****\n");

printf("****\n");

printf("****\n");

printf("****\n");

}

要求:

按照上面的程序范例,编写一个小程序,要求输出的是 4 行由*号组成的等腰三角形。

输入:无。

输出:指定图形。

程序实例1:

#include

int main( void )

{

printf( " *\n" );

printf( " ***\n" );

printf( " *****\n" );

printf( "*******\n" );

return 0;

}

结果:

输入:无

输出:

*

***

*****

*******

程序实例2:

#include"stdio.h"

main()

{

printf(" *\n");

printf(" ***\n");

printf(" *****\n");

printf("*******\n");

}

结果:

输入:无

输出:

*

***

*****

*******

1 温度转换(06秋)

背景:

经常出国旅行的驴友都知道,需要时时了解当地的气温状况,但不少国家采用了不同的温度计量单位:有些使用华氏温度标准(F),有些使用摄氏温度(C)。现在,请你根据温度转换公式设计一个温度转换程序,可以进行温度转换。如果输入摄氏温度,显示转换的华氏温度;如果输入华氏温度,显示转换的摄氏温度。

温度转换的公式为:F=(C×9/5)+32 ;C=(F-32)×5/9 ;式中F--华氏温度,C--摄氏温度。输入:第一个数据(1 或 2 )确定转换的类型:华氏转摄氏(1);摄氏转华氏(2);

第二个数据是相应需要转换的温度值。

输出:相应的转换后的温度值(保留小数点后 2 位)。

程序实例1:

#include

void main()

{ int a;

float x,y;

scanf("%d%f",&a,&x);

if ( a==1 )

{ y=(x-32)*5.0/9.0;

printf("The Centigrade is %.2f\n",y);

}

else if(a==2)

{ y=(x*9.0/5.0)+32;

printf("The Fahrenheit is %.2f\n",y);

}

}

结果:

输入:1 100

输出:The Centigrade is 37.78

输入:2 -6.67

输出:The Fahrenheit is 19.99

程序实例2:

#include

void main()

{float C;int a;

scanf("%d %f",&a,&C);

switch (a)

{case 1: printf("The Centigrade is %.2f\n",(C-32)*5/9);break;

case 2: printf("The Fahrenheit is %.2f\n",(C*9/5)+32);break;

default: printf("error\n");}

}

结果:

输入:1 0

输出:The Centigrade is -17.78

输入:2 88

输出:The Fahrenheit is 190.40

2 计算圆柱的侧面积及体积

如果已知圆柱的底面半径 r ,以及高 h ,则可计算出圆柱的侧面积 s=2πrh ,体积 v=π r 2 h 。其中π=3.1415926

输入:第一行输入圆柱的底面半径 r

第二行输入圆柱的高 h

输出:s=< 圆柱的侧面积 >,v=< 圆柱的体积 >

要求

1. 所有变量都定义为双精度类型

2. 结果精确到小数点后两位

程序实例1:

#include

#include

void main()

{

double r,h,s,v,PAI=3.1415926;

scanf("%lf\n%lf",&r,&h);

s=2*PAI*r*h;

v=PAI*r*r*h;

printf("s=%.2f,v=%.2f\n",s,v);

}

结果:

输入:

2

8

输出:s=100.53,v=100.53

程序实例2:

#include

void main()

{

double pi=3.1415926;

int r,h;

scanf("%d",&r);

scanf("%d",&h);

printf("s=%5.2f,v=%5.2f\n",2*pi*r*h,pi*r*r*h);

}

输入:

5

10

输出:s=314.16,v=785.40

3 计算时钟的夹角

背景:

钟面上的时针和分针之间的夹角总是在 ~之间 ( 包括和 ) 。举例来说,在十二点的时候两针之间的夹角为,而在六点的时候夹角为,在三点的时候为。本题要解决的是计算 12:00 到11:59 之间任意一个时间的夹角。

输入:每组测试数据包含两个数字:第一个数字代表小时 ( 大于 0 小于等于 12) ,第二个数字代表分 ( 在区间 [0, 59] 上 ) 。

输出:对应每组测试数据,用常用格式显示时间以及这个时候时针和分针间的最小夹角,精确到小数点后一位。输出格式如下所示。

程序实例1:

#include

void main()

{ float x,y,z;

scanf("%f %f",&x,&y);

z=6*y-(30*x+y/2);

{if (z<=-180) z+=360;

else if(z<0) z=-z;

else if (z>=180) z=360-z;

else z=z;}

if (y<10) printf("At %.0f:0%.0f the angle is %.1f degrees.",x,y,z);

else printf("At %.0f:%.0f the angle is %.1f degrees.",x,y,z);

}

输入:12 0

输出:At 12:00 the angle is 0.0 degrees.

程序实例2:

#include

#include

main()

{ int x,y; float z;

scanf("%d%d",&x,&y);

z=fabs(30*x-(float)y*11/2);

z=z>180?360-z:z;

if(y<10) printf("At %d:0%d the angle is %.1f degrees.\n",x,y,z); else printf("At %d:%d the angle is %.1f degrees.\n",x,y,z);

}

结果:

输入:12 30

输出:At12:30the angle is165.0degrees.

4 判断三角形的形状

要求:

输入三角型的三条边,判断三角形的形状。假设输入的三边边长均>0。

输入:三角型的3条边的长度(int型)。

输出:等边三角形:equilateral triangle

等腰三角形:isoceles triangle

不构成三角形:non-triangle

一般三角形:triangle

程序实例1:

#include

void main()

{int a,b,c;

scanf("%d %d %d",&a,&b,&c);

if(a+b<=c||a+c<=b||b+c<=a)

printf("non-triangle.");

else if(a==b&&b==c)

printf("equilateral triangle.");

else if(a==b&&b!=c||a==c&&c!=b||b==c&&c!=a)

printf("isoceles triangle.") ;

else printf("triangle.");

}

结果:

输入:22 2

输出:equilateral triangle.

程序实例2:

#include

void main()

{

int a,b,c;

scanf("%d%d%d",&a,&b,&c);

if(a==b&&b==c&&c==a)

printf("equilateral triangle.\n");

elseif(a+b>c&&a+c>b&&b+c>a)

(a==b||b==c||c==a)?printf("isocelestriangle.\n"):printf("triangle.\n");

else printf("non-triangle.\n");

}

结果:

输入:13 1

输出:non-triangle.

5 求解一元二次方程

初中的时候我们就会求解一元二次方程了,下面让我们来教计算机如何求解。输入 a,b,c ,就

一元二次方程 ax2+bx+c=0 的根。

输入:假设 a,b,c均int。

输出:要求输出的根为 double 型,保留 6 位小数。

程序实例1:

#include "stdio.h"

#include "math.h"

void main()

{int a,b,c,a2;

double x1=0,x2=0,q;

scanf("%d%d%d",&a,&b,&c);

q=b*b-4*a*c;

a2=2*a;

if(a==0)

{ if(b==0)

printf("Input error!\n");

else printf("x=%.6f\n",-c*1.0/b);

}

else if(q>0)

printf("x1=%.6f\nx2=%.6f\n",(-b+sqrt(q))/a2,(-b-sqrt(q))/a2);

else if(q==0)

printf("x1=x2=%.6f\n",-b*1.0/a2);

else if(q<0)

{ if(b==0) printf("x1=%.6fi\nx2=%.6fi\n",sqrt(-q)/a2,-sqrt(-q)/a2);

else

printf("x1=%.6f+%.6fi\nx2=%.6f-%.6fi",-b*1.0/a2,sqrt(-q)/a2,-1.0*b/a2,sqrt(-q)/a2); }

}

输入: 0 0 0

输出:Input error!

输入:2 2 2

输出:

x1=-0.500000+0.866025i

x2=-0.500000-0.866025i

程序实例2:

#include

#include

void main()

{

double a,b,c,d;

scanf("%lf%lf%lf",&a,&b,&c);

d=b*b-4*a*c;

if(a==0&&b==0) printf("Input error!\n");

else if(a==0) printf("x=%lf\n",c==0?0:-c/b);

else if(d==0) printf("x1=x2=%.6lf\n",b==0?0:-b/(2*a));

else if(d>0) printf("x1=%lf\nx2=%lf\n",(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a)); else if(b==0) printf("x1=%lfi\nx2=-%lfi\n",sqrt(-d)/(2*a),sqrt(-d)/(2*a));

else

printf("x1=%lf+%lfi\nx2=%lf-%lfi\n",-b/(2*a),sqrt(-d)/(2*a),-b/(2*a),sqrt(-d)/(

2*a));

}

结果:

输入:10 0 0

输出:x1=x2=0.000000

你会输出一行星号吗?(本题不记分噢)

我们才开始上机,现在需要我们用最简单得办法,在一行中输出N个星号。

输入:N值

输出:一行中N个星号。

程序实例1:

#include

void main()

{

int n,i;

scanf("%d",&n);

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

printf("*");

printf("\n");

}

结果:

输出:****

输入:8

输出:********

6 计算SUM的值

已知公式:SUM = 1 + 1/2 + 1/3 + 1/4 + ... + 1/n

输入:n

输出:表达式 sum 的值。结果保留 6 位小数。

程序实例1:

#include

void main()

{

int n,k;

double sum;

scanf("%d",&n);

sum=1.0;

for(k=2;k<=n;k++)

sum=sum+1.0/k;

printf("sum=%.6lf\n",sum);

}

结果:

输入:1

输出:sum=1.000000

程序实例2:

#include

void main()

{

double sum,i;

int n;

scanf("%d",&n);

for(i=1,sum=0;i<=n;i++)

sum=sum+1/i;

printf("sum=%.6lf",sum);

}

结果:

输入: 3

输出:sum=1.833333

7 贪吃的猴子

有一只猴子,第一天摘了若干个桃子,当即吃了一半,但还觉得不过瘾,就又多吃了一个。第2天早上又将剩下的桃子吃掉一半,还是觉得不过瘾,就又多吃了两个。以后每天早上都吃了前一天剩下的一半加天数个(例如,第5天吃了前一天剩下的一般加5个)。到第n天早上再想吃的时候,就只剩下一个桃子了。

输入:天数n

输出:第一天的桃子个数

程序实例1:

#include

void main()

{int n,i,y;

scanf( "%d",&n );

for( i=n-1, y=1 ; i>=1; i--)

y = 2*(i+y);

if( y==1 )printf( "The monkey got %d peach in first day.",y );

if( y!=1 )printf("The monkey got %d peachs in first day.",y);

}

结果:

输入:3

输出:The monkey got 14 peachs in first day.

8 求最后3位数值

中学时我们就会求一个数的 n 次方了,但计算机不会,请你来编写一个程序吧。由于计算机比较“笨”,所以我们编写程序的功能不用太强,只要能算出 a 的 n 次方的最后 3 位数就可以了。输入:和 n 的值。假设 a<=150 。

输出:求 a 的 n 次方的最后 3 位数。

程序实例1:

#include

void main()

{

int i,x,y,m=1;

scanf("%d %d",&x,&y);

for(i=1;i<=y;i++)

m=m*x%1000;

if(m==0)

printf("The last 3 numbers is 000.\n");

else

printf("The last 3 numbers is %d.\n",m);

}

结果:

输入:10 0

输出:The last 3 numbers is 1.

程序实例2:

#include

void main()

{int a,n,i,s;

scanf("%d%d",&a,&n);

i=1; s=1;

while(i<=n)

{s=s*a%1000;

i++;}

if(n!=0) {printf("The last 3 numbers is %0.3d.\n",s); }

else {printf("The last 3 numbers is %d.\n",s); }

}

结果:

输入:100 10

输出:The last 3 numbers is 000.

9 分数的四则运算

在小学时我们就学习了分数的四则运算,即对两个分数进行加、减、乘、除等运算,现在我们尝试下用C语言来实现。

输入:分数1 操作符分数2

输出:计算结果

要求:

计算结果使用分数表示,并且为最简化。例如结果为2/6,则被简化为1/3

程序实例1:

#include

int main()

{

int a,b,c,d,e,f,x,y,z;

char g;

scanf("%d/%d %c %d/%d",&a,&b,&g,&c,&d);

if(g=='+') { e=a*d+b*c;f=b*d; }

if(g=='-') { e=a*d-b*c;f=b*d; }

if(g=='*') { e=a*c;f=b*d; }

if(g=='/') { e=a*d;f=b*c; }

x=e; y=f; z=x%y;

if(z!=0)

{

while(z!=0)

{ x=y;y=z;z=x%y; }

e=e/y; f=f/y;

if(f>0) printf("%d/%d %c %d/%d = %d/%d",a,b,g,c,d,e,f);

if(f<0) printf("%d/%d %c %d/%d = %d/%d",a,b,g,c,d,-e,-f);

}

else { printf("%d/%d %c %d/%d = %d",a,b,g,c,d,e/f); }

printf("\n");

return 0;

}

结果:

输入:1/3 + 1/2

输出:1/3 + 1/2 = 5/6

程序实例2:

#include"math.h"

#include

void main()

{

int a,b,c,d,m,n,x,y,v;char z;

scanf("%d/%d %c %d/%d",&a,&b,&z,&c,&d);

switch (z)

{ case('+'):m=a*d+b*c;n=b*d;break;

case('-'):m=a*d-b*c;n=b*d;break;

case('*'):m=a*c;n=b*d;break;

case('/'):m=a*d;n=b*c;break;

}

x=fabs(m);y=fabs(n);v=x%y;

while(v!=0)

{x=y;y=v;v=x%y;}

if(m/y==0) printf("%d/%d %c %d/%d = 0\n",a,b,z,c,d);

else if(n/y==1) printf("%d/%d %c %d/%d = %d\n",a,b,z,c,d,m/y);

else printf("%d/%d %c %d/%d = %d/%d\n",a,b,z,c,d,m/y,n/y);

}

结果:

输入:1/2+2/6

输出:1/2+2/6=5/6

10 黑色星期五

在西方,星期五和数字13都代表着坏运气,两个不幸的个体最后结合成超级不幸的一天。所以,不管哪个月的十三日又恰逢星期五就叫“黑色星期五”。

输入:年份

输出:判断该年是否包含黑色星期五,如包含,给出具体日期

程序实例1:

#include "stdio.h"

void main()

{

int year,month,day,i,k=0,ruinian,n;

int a[12]={6,2,2,5,0,3,5,1,4,6,2,4};

int b[12]={6,2,3,6,1,4,6,2,5,0,3,5},c[12]={0};

scanf ("%d",&year);

n=((year%400)*365+(year%400+3)/4-(year%400)/100+5)%7;

ruinian=(year%4==0 && year%100!=0 || year%400==0);

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

if ((((ruinian==1)?b[i]:a[i])+n)%7==5)

c[i]=1;

k++;

}

printf ("There %s %d Black %s in year %d.\n%s:\n",(k==1)?"is":"are",k,(k==1)?"Friday":"Fridays",year,(k==1)?"It is":"They are");

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

if (c[i]==1)

printf ("%d/%d/13\n",year,i+1);

}

结果:

输入:2006

输出:

There are 2 Black Fridays in year 2006.

They are:

2006/1/13

2006/10/13

程序实例2:

#include"stdio.h"

void main()

{ int m,y,k=0,i,w,a[6];

scanf("%d",&y);

for(m=1;m<=2;m++)

{ w=(13+2*(m+12)+3*(m+13)/5+y-1+(y-1)/4-(y-1)/100+(y-1)/400)%7;

if(w==4)

{ a[k]=m;k++;} }

for(m=3;m<13;m++)

{ w=(13+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;

if(w==4)

{a[k]=m;k++;} }

if(k==1) { printf("There is 1 Black Friday in year %d.\nIt is:\n%d/%d/13\n",y,y,a[0]);} else {printf("There are %d Black Fridays in year %d.\n",k,y);

printf("They are:\n");

for(i=0;i

printf("%d/%d/13\n",y,a[i]);}

}

结果:

输入:2007

输出:

There are 2 Black Fridays in year 2007

They are:

2007/4/13

11 百马百担

有100匹马,驮100担货,其中大马驮3担,中马驮2担,两匹小马驮1担

输入:无

输出:大、中、小马的个数,用逗号分隔。例如:2,30,68

说明:大、中、小马都必须有,结果中要列出所有的组合可能每个结果占一行因为有多个结果,结果的排序按照大马的个数从少到多

程序实例1:

#include

void main()

{

int bigHorse,middleHorse,smallHorse;

bigHorse=0;

while(bigHorse<=33)

{

middleHorse=1;

while(middleHorse<50)

{

smallHorse=100-bigHorse-middleHorse;

if(3*bigHorse+2*middleHorse+smallHorse/2==100&&smallHorse%2==0) printf("%d,%d,%d\n",bigHorse,middleHorse,smallHorse);

middleHorse++;

}

bigHorse++;

}

}

结果:

输入:无

输出:

2,30,68

5,25,70

8,20,72

11,15,74

14,10,76

17,5,78

程序实例2

#include

void main()

{

int a,b,c;

for(a=0;a<=33;a++)

{

for(b=1;b<50;b++)

{

c=100-a-b;

if(3*a+2*b+c/2==100&&c%2==0)

printf("%d,%d,%d\n",a,b,c);

}

}

}

结果:

输入:无

输出:

2,30,68

5,25,70

8,20,72

11,15,74

14,10,76

17,5,78

12 零钱换整钱

小明去银行存钱,拿了一堆硬币。已知 1 角的硬币厚度为 1.8mm , 5 角的硬币厚 1.5mm , 1 元的硬币为 2.0mm 。小明将 1 角的硬币放成一摞,将 5 角的硬币硬币放成一摞,将 1 元的硬币放成一摞,发现 3 摞硬币一样高。银行正好把这些硬币换成若干张面值为 10 元的纸币。问小明至少带了多少钱的硬币(元为单位),每种面值的硬币有多少个?

输入:无

输出:1 角的数量,5 角的数量,1元的数量,总金额。(例如:20,30,40,50)

说明:在结果中只输出各个对应的数字即可

程序实例1:

#include

int yue(int a,int b)

{

int t;

t=a%b;

while(t)

{a=b,b=t,t=a%b;}

return b;

}

int main(void)

{int x,y,z;

x=18*15/yue(18,15);

x=x*20/yue(x,20);

z=y=x/18+x*5/15+x/2;

while(z%100)

{z+=y;}

printf("%d,%d,%d,%d\n",z/y*x/18,z/y*x/15,z/y*x/20,z/10);

return 0;

}

结果:

输入:无

输出:50,60,45,80

程序实例2:

#include

int main()

{int i,j,k,a;

for(i=10;;i+=10)

{j=6*i/5;k=9*i/10;a=0.1*i+0.5*j+1.0*k;

if(a%10==0) {printf("%d,%d,%d,%d\n",i,j,k,a);break;}

}

return 0;}

结果:

输入:无

输出: 50,60,45,80

13 找出最大素数

素数是指一个只能被1和它本身整除的数,在数论中占有重要的研究地位,在当代密码学中也被广泛应用。

输入:

取值范围

输出:

该范围内的最大素数

程序实例1

#include

#include

int judgeis(int a)

{

int i;

for(i=2;i

{if (a%i==0) {return 0;}}

return 1;

}

int main()

{

int n;

scanf("%d",&n);

while(judgeis(n)==0){n--;}

printf("The max prime number is %d.",n);

return 0;

}

输入:100

输出:The max prime number is 97.

程序实例2:

#include

#include

int IsPrime(int n) {

int i;

for(i=2;i<=sqrt(n);i++)

if(n%i==0) return(0);

return(1);

}

void main() {

int n;

scanf("%d",&n);

for(;;n--) if(IsPrime(n)) break;

printf("The max prime number is %d.\n",n);

}

结果:

输入:5555

输出:The max prime number is 5531.

14 空心的倒三角型

背景:

请根据要求打印可空心倒三角形。

输入:

输入三角形的高度(h >= 0)。

输出:

打印相应的空心倒三角形。图样参见测试用例。

程序实例1:

#include

int main(void)

{

int n,i,j;

scanf("%d",&n);

for(i=0;i

{for(j=0;j<(2*n-1-i);j++)

{if (i==0||i==j||j==(-i+2*n-2))printf("*"); else printf(" ");

}

printf("\n");

}

return 0;

}

相关文档