算法竞赛入门经典(第2版)学习笔记1
第一章 程序入门设计
1.1 算数表达式
程序1-2:计算并输出8/5的值,保留小数点后1位
#include<stdio.h>
int main(){
printf("%.1f\n",8.0/5.0);
return 0;
}
注1:%后的.1表示保留小数点后几位
注2:整数值用%d输出,实数用%f输出。只要运算符的两边都是整数,则运算结果也会是整数。8.0和5.0被看作是实数
注3:整数/整数=整数,浮点数/浮点数=浮点数
1.2 变量及其输入
注1:在算法竞赛中不要使用头文件conio.h,包括getch()、clrscr()等函数。注意输出格式!输出的每两个数或者字符串之间应以单个空格隔开
例题1-1 圆柱体的表面积
输入底面半径r和高h,输出圆柱体的表面积,保留3位小数
样例输入:
3.5 9
样例输出:
Area=274.889
程序1-5:
#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=2*pi*r*r;
s2=2*pi*r*h;
s=s1+s2;
printf("Area=%.3lf\n",s);
return 0;
}
注2:尽量用const关键字声明常数
1.3 顺序结构程序设计
例题1-2 三位数反转
输入一个三位数,分离出它的百位、十位和个位,反转后输出
样例输入:
127
样例输出:
721
注:此题有一个细节问题,当个位是0时,反转后是否还应该输出?如:520,输出是025还是25?如果遇到这样的问题,则可以向监考人员询问。
程序1-6 个位数是0且输出0的情况:
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
printf("%d%d%d",n%10,n/10%10,n/100);
return 0;
}
程序1-7 个位数是0且不输出0的情况:
#include<stdio.h>
int main(){
int n,a;
scanf("%d",&n);
a=n%10;
if(a!=0)
printf("%d%d%d",n%10,n/10%10,n/100);
else
printf("%d%d",n/10%10,n/100);
return 0;
}
另一种方法:
#include<stdio.h>
int main(){
int n,a;
scanf("%d",&n);
a=(n%10)*100+(n/10%10)*10+(n/100);
printf("%d\n",a); //若想要输出025,则把输出格式变为%03d(如果不够3位则在前面补0)
return 0;
}
1.4 分支结构程序设计
例题1-4 鸡兔同笼
已知鸡和兔的总数量为n,总腿数为m。输入n和m,依次输出鸡的数目和兔的数目。如果无解,则输出No answer。
样例输入:
14 32
样例输出:
12 2
样例输入:
10 16
样例输出:
No answer
分析:设鸡有a只,兔有b只,则a+b=n,2a+4b=m,联立。在什么情况下无解,首先a和b都是整数,其次a和b必须都是非负的。
#include<stdio.h>
int main(){
int a,b,m,n;
scanf("%d%d",&n,&m);
b=(m-2*n)/2;
a=n-b;
if(m%2==1 || a<0 || b<0){
printf("No answer");
}
else{
printf("%d %d",a,b);
}
return 0;
}
注:算法竞赛的目标是编程对任意输入均得到正确的结果,而不仅是样例数据
1.5 注解与习题
1.5.2 数 据 类 型 与 输 入 格 式
问题一:如果要输出斜线“\”和字符n,怎么办?
方法:“ printf("\n"); ”编译器会把双斜线“\”理解成单个字符“\”
问题二:如何连续输出“%”和 d两个字符?
方法:“ printf("%%d");”
1.5.3 习 题
习题1-1 平均数(average)
输入3个整数,输出它们的平均值,保留3位小数。
#include<stdio.h>
int main(){
int a,b,c;
float avg;
scanf("%d%d%d",&a,&b,&c);
avg=(a+b+c)/3.0;
printf("%.3f",avg);
}
习题1-2 温度(temperature)
输入华氏温度f,输出对应的摄氏温度c,保留3位小数。
提示:c=5(f-32)/9。
#include<stdio.h>
int main(){
float f,c;
scanf("%f",&f);
c=5*(f-32)/9;
printf("%.3f\n",c);
}
习题1-3 连续和(sum)
输入正整数n,输出1+2+…+n的值。提示:目标是解决问题,而不是练习编程。
#include<stdio.h>
int main(){
int n,s;
scanf("%d",&n);
s=(1+n)*n/2;
printf("%d",s);
}
习题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);
printf("%f %f",sin(n/180.0*pi),cos(n/180.0*pi));
}
注:角度转弧度值:c语言中sin(x) cos(x),x是弧度值,需要先将输入的角度n转换成弧度值,x=n/180*Π
习题1-5 打折 (discount)
一件衣服95元,若消费满300元,可打八五折。输入购买衣服件数,输出需要支付的金额(单位:元),保留两位小数。
#include<stdio.h>
int main(){
int n;
double s;
scanf("%d",&n);
s=n*95;
if(s>=300)
printf("%.2f",s*0.85);
else
printf("%.2f",s);
}
习题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){
if((a*a+b*b==c*c) || (b*b+c*c==a*a) || (a*a+c*c==b*b))
printf("yes");
else
printf("no");
}
else
printf("not a triangle");
}
习题1-7 年份(year)
输入年份,判断是否为闰年。如果是,则输出yes,否则输出no。提示:简单地判断除以4的余数是不够的。
#include<stdio.h>
int main(){ //四年一闰,百年不闰,四百年再闰
int n;
scanf("%d",&n);
if(n%400==0 || (n%4==0 && n%100!=0))
printf("yes");
else
printf("no");
}
思考题:
问题1: int型整数的最小值和最大值是多少(需要精确值)?
答:-231 ~(231-1),即-2147483648 ~ +2147483647
问题2:double型浮点数能精确到多少位小数?或者,这个问题本身值得商榷?
答:本身值得商榷,double型浮点数实际精度为15-16位,即能精确到15~16位有效数字。
问题3:double型浮点数最大正数值和最小正数值分别是多少(不必特别精确)?
答:-21024 ~ 21024,即-1.7910308~ +1.7910308
问题4:逻辑运算符号“&&”、“||”和“!”(表示逻辑非)的相对优先级是怎样的?也就是说,a&&b||c应理解成(a&&b)||c还是a&&(b||c),或者随便怎么理解都可以?
答:优先级从高到低顺序为 ! > && > ||
问题5:if(a)if(b)x++;else y++的确切含义是什么?这个else应和哪个if配套?有没有办法明确表达出配套方法?
答:else应该与最近的没有else配对的if进行匹配。
if(a)等价于if(a!=0)
来源:CSDN
作者:不好好学习是猪
链接:https://blog.csdn.net/weixin_42617229/article/details/104234596