今天心血来潮,决定将《算法竞赛入门经典》里面的课后题,进行详解,先来第一发。
习题1-1 平均数(average)
对于第一题,相信即便是第一次接触编程的人。只要稍稍了解一下C的语法,也可轻易解决这一题。所以我也不多说了直接上代码。
#include
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
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
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
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
printf("%d\n",(n+1)*n/2);
}
return 0;
}
习题1-4 正弦和余弦(sin cos)
#include
#include
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
#include
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
int main()
{
int a;
while(scanf("%d",&a)!=EOF){
printf("%s\n",a%2?"no":"yes");
}
return 0;
}
习题1-7 打折(discount)
#include
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
int main()
{
double n;
while(scanf("%lf",&n)!=EOF){
printf("%.2lf\n",n>0?n:-n);
}
return 0;
}
习题1-9 三角形(triangle)
判断三条边是否可以构成三角形,我们可以使用任意两边和大于第三边的方式:
#include
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
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;
}
【第二章】课后习题:传送门
【第三章】课后习题:传送门