今天心血来潮,决定将《算法竞赛入门经典》里面的课后题,进行详解,先来第一发。
习题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"); else printf("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"); else printf("no\n"); } return 0; }
其他章节我会慢慢补上,持续更新中。。。