• 《算法竞赛入门经典》第1章 程序设计入门


    提示1-1:整数值用%d输出,实数用%lf输出。

    提示1-2:整数/整数=整数,浮点数/浮点数=浮点数。

    提示1-3:scanf中的占位符和变量的数据类型应一一对应,且每个变量前需要加&(取地址)符号。

    提示1-4:在算法竞赛中,输入前不要打印提示信息。输出完毕后应立即终止程序,不要等待用户按键,因为输入输出过程都是自动的,没有人工干预。

    提示1-5:在算法竞赛中不要使用头文件conio.h,包括getch()、clrscr()等函数。

    提示1-6:在算法竞赛中,每行输出均应以回车符结束,包括最后一行。除非特别说明,每行的行首不应有空格,但行末通常可以有多余空格。另外,输出的每两个数或者字符串之间应以单个空格隔开。

    提示1-7:尽量用const关键字声明常数。

    1 const double pi = 4.0 * atan(1.0);

    这里声明了一个叫pi的符号,但是const关键字表明它的值是不可以被改变的——pi是一个真正的数学常数。有的读者可能会用math.h中定义的常量M_PI,但其实这个常数不是ANSI C标准的,不信的话可以用"gcc -ansi"编译试试。

    提示1-8:赋值是个动作,先计算右边的值,在赋给左边的变量,覆盖它原来的值。

    提示1-9:printf的格式字符串中可以包含其他可打印字符,打印时原样输出。

    例题1-2 三位数反转

    输入一个三位数,分离出它的百位、十位和各位,反转后输出。

    样例输入:127

    样例输出:721

    1 #include <stdio.h>
    2 
    3 int main()
    4 {
    5     int n;
    6     scanf("%d", &n);
    7     printf("%d%d%d
    ", n%10, n/10%10, n/100);
    8     return 0;
    9 }

    运行结果如下:

    说明:运算符*、/、%的优先级相同(优先级4),为左结合性,即从左往右运算。

    上面的程序输出027,但要改成输出27似乎会比较麻烦——我们必须判断n&10是不是0。一个解决方法是把结果储存到变量m当中,这样,直接用%d格式输出m,将输出27。如果要输出027也很容易,把输出格式变为%03d即可。

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     int n, m;
     6 
     7     scanf("%d", &n);
     8     m = (n % 10) * 100 + (n / 10 % 10) * 10 + n / 100;
     9     printf("%03d
    ", m);
    10     return 0;
    11 }

    运行结果如下:

    提示1-10:算法竞赛的题目应当是严密的,各种情况下的输入均应有严格规定。如果在比赛中发现题目有漏洞,应向相关人员询问,而尽量不要自己随意假定。

    例题1-3 交换变量

    输入两个整数a和b,交换二者的值,然后输出。

    样例输入:824 16

    样例输出:16 824

     1 /* 三变量法 */
     2 #include <stdio.h>
     3 
     4 int main()
     5 {
     6     int a, b, t;
     7 
     8     scanf("%d%d", &a, &b);
     9     t = a;
    10     a = b;
    11     b = t;
    12     printf("%d %d
    ", a, b);
    13 
    14     return 0;
    15 }

    也可以不使用中间变量

     1 /* 两变量法 */
     2 #include <stdio.h>
     3 
     4 int main()
     5 {
     6     int a, b, t;
     7 
     8     scanf("%d%d", &a, &b);
     9     a = a + b;
    10     b = a - b;
    11     a = a - b;
    12     printf("%d %d
    ", a, b);
    13 
    14     return 0;
    15 }

    最合适的程序莫过于

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     int a, b, t;
     6 
     7     scanf("%d%d", &a, &b);
     8     printf("%d %d
    ", b, a);
     9 
    10     return 0;
    11 }

    换句话说,我们的目标是解决问题,而不是为了写程序而写程序,同时应保持简单(Keep It Simple and Stupid,KISS),而不是自己创造条件去展示编程技巧。

    提示1-13:算法竞赛是在比谁能更好地解决问题,而不是在比谁写的程序看上去更高级。

    例题1-4 鸡兔同笼

    已知鸡和兔的总数量为n,总腿数为m。输入n和m,依次输出鸡的数目和兔的数目。如果无解,则输出“No answer”。

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     int a, b, n, m;
     6 
     7     scanf("%d%d", &n, &m);
     8     a = (4*n -m) / 2;
     9     b = n - a;
    10     if (m % 2 == 1 || a < 0 || b < 0)
    11     {
    12         printf("No answer
    ");
    13     }
    14     else
    15     {
    16         printf("%d %d
    ", a, b);
    17     }
    18 
    19     return 0;
    20 }

    运行结果如下:

  • 相关阅读:
    017 文件xfs_repair恢复,xfs_dump恢复,lvm动态扩容
    003 rsync客户端与服务端小脚本
    002 rsync守护进程传输方式详解
    001 期中架构简介、备份初识
    016 netstat、磁盘分区(fdisk、gdisk)
    015 Linux中常用的信号、HUP信号
    014 进程(PS与TOP)
    013 源码安装(Nginx&php为例)
    本地、远程仓库的搭建
    第八章
  • 原文地址:https://www.cnblogs.com/rezone/p/3201659.html
Copyright © 2020-2023  润新知