算法竞赛入门经典第一章

1.1算术表达式

printf("%.1f\n",8.0/5.0);

此段话为保存一位小数。

printf("%f\n",8.0/5.0); 

此段话为保存六位小数。

printf("%.1f\n",8/5); 

此段话结果为0.0。

printf("%d\n",8.0/5.0); 

此段话结果为-1717986918。

1.2复杂的表达式计算

需要添加头文件,

#include<math.h>

例如sqrt的使用。

例题1-1 圆柱体的表面积

输入底面半径r和高h,输出圆柱体的表面积,保留三位小数。

#include<stdio.h>
#include<math.h>
int main()
{
    const double pi=acos(-1.0);
    double r,h,s1,s2,s;
    scanf("%lf%lf",&r,&h);
    s1=pi*r*r;
    s2=2*pi*r*h;
    s=s1*2.0+s2;
    printf("Area = %.3f\n",s);
    return 0;
} 

本段话中要注意lf而不是1f,否则会出错。

C语言问题%f和%lf的区别

%f和%lf分别是float类型和double类型用于格式化输入输出时对应的格式符号。
其中:
float,单精度浮点型,对应%f.
double , 双精度浮点型,对应%lf.

在用于输出时:
float类型可以使用%lf格式,但不会有任何好处。
double类型如果使用了%f格式可能会导致输出错误。

在用于输入时:
double 类型使用了%f格式,会导致输入值错误。
float类型使用double类型不仅会导致输入错误,还可能引起程序崩溃。

C语言中float和double的区别

double、float都是浮点型。double(双精度型)比float(单精度型)存的数据更准确些,占的空间也更大。double精度是float的两倍,所以需要更精确的计算常使用double。double>float

单精度浮点数在机内占4个字节,用32位二进制描述。
双精度浮点数在机内占8个字节,用64位二进制描述。

对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。

非常重要的竞赛提示

在算法竞赛中,输入前不要打印提示信息。
输入完毕后立即终止程序,不要等待用户按键,因为输入输出过程都是自动的,没有人工干预。
不要在算法竞赛中使用 getch() getche() gotoxy() clrscr() 等函数。
输出格式是非常严厉的,多一个或者少一个字符都是不可以的。
在算法竞赛中,每行输出均应以回车符结束,包括最后一行。除非特别说明,每行的首行不应有空格,但行末通常可以有多余空格。另外,输出的每两个数或者字符串之间应以单个空格隔开。
尽量使用const关键字声明常数。

1.3顺序结构程序设计

%是取余数操作
/ 是取商操作

%3d 可以指定宽度,不租的左边补空格
%-3d 左对齐
%03d 左边补0的等宽格式

变量交换

方法一:(推荐使用)
t=a;
a=b;
b=t;

方法二:(不推荐使用)
a=a+b;
b=a-b;
a=a-b;

1.4分支结构程序设计

例题1-4 鸡兔同笼

#include<stdio.h>
int main()
{
    int a,b,n,m;
    scanf("%d%d",&n,&m);
    a=(4*n-m)/2;
    b=n-a;
    if(m%2==1||a<0||b<0)
        printf("No answer\n");
    else
        printf("%d %d\n",a,b);
    return 0;
} 

短路运算符

C语言中的逻辑运算符都是短路运算符。一旦能够确定整个表达式的值,就不再继续计算。

习题

习题1-1 平均数(average)

输入3个整数,输出它们的平均值,保留3位小数。

#include<stdio.h>
int main()
{
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    printf("%.3f",(a+b+c)/3.0);
    return 0;
} 

习题1-2 温度(temperature)

输入华氏温度f,输出对应的摄氏温度c,保留3位小数。提示:c=5(f-32)/9。

#include<stdio.h>
int main()
{
    float f,c;
    scanf("%f",&f);
    printf("%.3f",5.0*(f-32.0)/9.0);
    return 0;
} 

习题1-3 连续和(sum)

输入正整数n,输出1+2+…+n的值。提示:目标是解决问题,而不是练习编程。

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

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

输入正整数n(n<360),输出n度的正弦、余弦函数值。提示:使用数学函数。

#include<stdio.h>
#include<math.h>
int main()
{
    const double pi=acos(-1.0);
    int n;
    scanf("%d",&n);
    if(n<=0||n>=360)
        printf("input error!");
    else
        printf("%f %f\n",sin(n*pi/180.0),cos(n*pi/180.0));
    return 0;
} 

习题1-5 打折 (discount)

一件衣服95元,若消费满300元,可打八五折。输入购买衣服件数,输出需要支付的金额(单位:元),保留两位小数。

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    if(n<=0)
        printf("input error");
    else if(n>3)
        printf("%.3f",n*95.0*0.85);
    else
        printf("%.3f",n*95.0);  
    return 0;
} 

习题1-6 三角形(triangle)

输入三角形3条边的长度值(均为正整数),判断是否能为直角三角形的3个边长。如果 可以,则输出yes,如果不能,则输出no。如果根本无法构成三角形,则输出not a triangle。

#include<stdio.h>
int main()
{
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    if(!(a+b>c&&a+c>b&&b+c>a))
        printf("not a triangle");
    else
    {
        if(a*a+b*b==c*c)
            printf("yes");
        else if(a*a+c*c==b*b)
            printf("yes");
        else if(b*b+c*c==a*a)
            printf("yes");
        else
            printf("no");   
    }       
    return 0;
} 

习题1-7 年份(year)

输入年份,判断是否为闰年。如果是,则输出yes,否则输出no

#include<stdio.h>
int main()
{
    int year;
    scanf("%d",&year);
    if((year%4==0&&year/100!=0)||(year%400==0)) 
        printf("yes");
    else
        printf("no");       
    return 0;
}   

作者注

代码均为自己所写,如认为有错误,欢迎前来探讨,谢谢~~

算法竞赛入门经典——训练指南》代码仓库 例题代码 限于篇幅,书上并没有给出所有例题的代码,这里给出了所有例题的代码,并且改进了书上的一些代码。 第一章 32题 38份代码 第二 28题 30份代码 第三 22题 23份代码 第四 19题 21份代码 第五 34题 39份代码 第六 24题 26份代码 共159题 177份代码 为了最大限度保证代码风格的一致性,所有例题代码均由刘汝佳用C++语言编写。 所有代码均通过了UVa/La的测试,但不能保证程序是正确的(比如数据可能不够强),有疑问请致信rujia.liu@gmail.com,或在googlecode中提出: http://code.google.com/p/aoapc-book/ [最新更新] 2013-04-23 增加字符串中例题10(UVa11992 Fast Matrix Operations)的另一个版本的程序,执行效率较低,但更具一般性,可读性也更好 2013-04-22 增加字符串部分“简易搜索引擎”代码,可提交到UVa10679 2013-04-13 修正Treap中优先级比较的bug(原来的代码实际上是在比较指针的大小!),加入纯名次树代码 2013-03-31 修正UVa1549标程的bug,即buf数组不够大。 增加线段树部分“动态范围最小值”的完整代码 2013-03-23 修正UVa10054标程的bug,即没有判断是否每个点的度数均为偶数。UVa数据已经更新 LA3401修正了代码和文字不一致的问题 UVa11270增加了答案缓存 2013-03-21 增加线段树部分中两个经典问题的完整代码:快速序列操作I和快速序列操作II 2013-02-28 补全所有159道例题的代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值