【算法竞赛入门经典】【第一章】课后习题

今天心血来潮,决定将《算法竞赛入门经典》里面的课后题,进行详解,先来第一发。

习题1-1 平均数(average)

对于第一题,相信即便是第一次接触编程的人。只要稍稍了解一下C的语法,也可轻易解决这一题。所以我也不多说了直接上代码。

#include <stdio.h>int main(){int a, b, c;while(scanf("%d%d%d",&a,&b,&c)!=EOF){printf("%.3lf\n",(a+b+c)/3.0);}return 0;}

习题1-2 温度(temperature)

题目连公式都给了,没什么好说的

#include <stdio.h>int main(){double f,c;while(scanf("%lf",&f)!=EOF){c = 5 * ( f – 32 ) / 9;printf("%.3lf\n",c);}return 0;}

习题1-3 连续和(sum)

这一题的话,我相信肯定会有一部分人在学完循环之后代码会这样写

#include <stdio.h>int main(){int n,sum,i;while(scanf("%d",&n)!=EOF){sum = 0;for(i = 1; i <= n; i++ )sum += i;printf("%d\n",sum);}return 0;}

或者是使用while之类的循环语句来做。但是我要说这样不行,当然不是它不对,而是在算法竞赛中除了答案之外,我们最重视的就是效率了,用循环需要执行至少n次。然而如果我们使用递增数列的求和公式的话,我们的效率将大大的提高,,在算法竞赛中我们使用的是黑盒评测的模式,这种模式的特点就是只关心结果而不关心过程。所以我们的代码应该这样:

#include <stdio.h>int main(){int n;while(scanf("%d",&n)!=EOF){printf("%d\n",(n+1)*n/2);}return 0;}

习题1-4 正弦和余弦(sin cos)

#include <stdio.h>#include <math.h>int main(){double n;while(scanf("%lf",&n)!=EOF){printf("%lf,%lf\n",sin(n),cos(n));}return 0;}

这一题中我们使用到了数学函数,其中大部分的数学函数均在 math.h 中。我还要说明一点在算法竞赛中我们只需要输出结果,并不需要多余的提示,不然你会发现你的答案会莫名的错了。然而这个应该就是算法竞赛和实际编程中的区别之一。

习题1-5 距离(distance)

#include <stdio.h>#include <math.h>int main(){double x1,y1,x2,y2;while(scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2)!=EOF){printf("%.3lf\n",sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));}return 0;}

习题1-6 偶数(odd)

判断偶数的方法有很多,这里我就用我认为最简单的方法

#include <stdio.h>int main(){int a;while(scanf("%d",&a)!=EOF){printf("%s\n",a%2?"no":"yes");}return 0;}

习题1-7 打折(discount)

#include <stdio.h>int main(){int n;double monkey;while(scanf("%d",&n)!=EOF){monkey = 95 * n;if( n > 3)monkey *= 0.85;printf("%.3lf\n",monkey);}return 0;}

习题1-8绝对值(abs)这一题有两种方法,一种使用库函数,一种不用。下面我使用不适用库函数的方法吧:

#include <stdio.h>int main(){double n;while(scanf("%lf",&n)!=EOF){printf("%.2lf\n",n>0?n:-n);}return 0;}

习题1-9 三角形(triangle)

判断三条边是否可以构成三角形,我们可以使用任意两边和大于第三边的方式:

#include <stdio.h>int main(){int a,b,c;while(scanf("%d%d%d",&a,&b,&c)!=EOF){if( a+b>c && a+c>b && b+c>a )printf("yes\n");elseprintf("no\n");}return 0;}

习题1-10 年份(year)

①、普通年能被4整除且不能被100整除的为闰年。

②、世纪年能被400整除的是闰年

③、对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。如172800年是闰年,86400年不是闰年(这一点我们通常可以不用考虑)

于是代码如下:

#include <stdio.h>int main(){int year;while(scanf("%d",&year)!=EOF){if(year%400==0)printf("yes\n");else if(year%4==0&&year%100!=0)printf("yes\n");elseprintf("no\n");}return 0;}其他章节我会慢慢补上,持续更新中。。。



不畏不惧,不言不弃,冲破风雨的阻隔,黎明就在前方!

【算法竞赛入门经典】【第一章】课后习题

相关文章:

你感兴趣的文章:

标签云: