算法竞赛入门经典第一章小结与练习

之前没怎么系统地学习过算法,在网上看到《算法竞赛入门经典》这本书还不错,下决心跟着做一做练一练。

第一章

【学习目标】

1.熟练C语言程序的编译和运行

  流程:C源程序头文件 —> 预编译处理(cpp) —> 编译程序本身 —> 优化程序 —> 汇编程序 —> 链接程序 —> 可执行文件

  具体原理以后再做研究吧。。。

2.学会编程计算并输出常见的算法表达式的结果

  • 输出时%d,%ld,%f,%lf,%5.2f,包括数据强制转换。
  • include <math.h>中常用数学函数包括:
    • 绝对值double fabs(double);
    • 三角函数double sin(double);
    • 反三角double asin(double);
    • 开方double sqrt(double);
    • 求幂double pow(double a, double x)means a^x;
    • 求对数 (e为底)double log(double);(10为底)double log10(double)
    • 取上整double ceil(double);取下整double floor(double); 这里上和下可以理解为取大和取小,比如-1.44,floor后是-2.0,ceil后是-1.0
    • 注意abs()定义在<stdlib.h>中,也可宏定义:“abs(x) : ((x > 0) ? (x) : (-(x)))”。

3.掌握整数和浮点数的含义和输出方法

  int、float和double,基本上可以一直使用double吧。scanf()会区分%lf和%f。

4.掌握数学函数的使用方法

const double pi = 4.0 * atan(1.0);

5.初步了解变量的含义

6.掌握整数和浮点数变量的声明方法

int i; float a; double s;

7.掌握整数和浮点数变量的读入方法

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

8.掌握变量交换的三变量法

1
2
3
4
5
int i, j, tmp;

tmp = i;
i = j;
j = tmp;

例题

三整数排序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>

int main()
{
	int a, b, c, t;
	
	scanf("%d %d %d", &a, &b, &c);
	if(a>b)	{
		t = a, a = b, b = t;
	}
	if(a>c)	{
		t = a, a = c, c = t;
	}
	if(b>c)	{
		t = b, b = c, c = t;
	}
	printf("%d %d %d\n", x, y, z);
	return 0;
}

实验

使用整型数据时,6个1平方会溢出。sqrt(-10),使用整型输出时为0,浮点型时为-1.#IND00。浮点数 1.0/0.0 结果是inf,0.0/0.0结果是nan,1/0报错。

scanf()自动滤掉空格;输出%d用”%%d”,输出“\n”用”\n”。

实践

问题1:int型浮点数的最小值和最大值是多少?

1
2
3
4
5
6
7
8
9
#include <stdio.h>    
int main()    
{    
    int i;    
    
    for (i = 1; i > 0; i++) NULL;    
    printf("%d %d\n", i, i-1);    
    return 0;    
}

输出较慢。

问题2:double型浮点数能精确到多少位小数?或者,这个问题本身值得商榷?

练习

1-1 average

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main()
{
    int a, b, c;
    float ave;

    scanf("%d%d%d", &a, &b, &c);
    ave = (a + b + c) / 3.0;
    printf("%.3f\n", ave);
    return 0;
}

1-2 temperature

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main()
{
    int f;

    scanf("%d", &f);
    printf("%.3f\n", 5.0 * (f - 32.0) / 9.0);
    return 0;
}

1-3 sum

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main()
{
    int n;

    scanf("%d", &n);
    printf("%d\n", n * (n + 1) / 2);
    return 0;
}

1-4 sincos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <math.h>

int main()
{
    int n;
    double d;
    const double PI = 4.0 * atan(1.0);

    scanf("%d", &n);
    d = (n / 180.0) * PI;
    printf("%.3f %.3f\n", sin(d), cos(d));
    return 0;
}

1-5 distance

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <math.h>

int main()
{
    double x1, y1, x2, y2;
    double d;

    scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
    d = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    printf("%.3f\n", d);
    return 0;
}

这个开始时输入使用%f,输出为错误,改为%lf结果正确。

1-6 odd

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main()
{
    int n;

    scanf("%d",&n);
    printf(n / 2 == 1 ? "No\n" : "Yes\n");
    return 0;
}

1-7 discount

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main()
{
    int n;

    scanf("%d", &n);
    printf("%.3f\n", (95 * n < 300) ? 95.0 * n : 95.0 * n * 0.85);
    return 0;
}

1-8 abs

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#define ABS(x) ( (x) > 0 ? (x) : (-(x))  )

int main()
{
    double s;

    scanf("%lf", &s);
    printf("%.3lf\n", ABS(s));
    return 0;
}

1-9 triangle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>

int  main()
{
    int a, b, c;
    int tmp;

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

    if (a < b) {
        tmp = a;
        a = b;
        b = tmp;
    }
    if (a < c) {
        tmp = a;
        a = c;
        c = tmp;
    }
    if (b < c) {
        tmp = b;
        b = c;
        c = tmp;
    }

    if (b*b+c*c == a*a)
        printf("yes\n");
    else
        printf(a >= b+c ? "not a triangle\n" : "no\n");

    return 0;
}

1-10 year

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int main()
{
    int n;

    scanf("%d", &n);
    if( n % 400 == 0 || (n % 4 == 0 && n % 100 != 0))
        printf("yes\n");
    else
        printf("no\n");
    return 0;
}