蓝桥杯备考——算法竞赛入门经典(第2版)学习笔记1

算法竞赛入门经典(第2版)学习笔记1

  • 第一章 程序入门设计
    • 1.1 算数表达式
    • 1.2 变量及其输入
    • 1.3 顺序结构程序设计
    • 1.4 分支结构程序设计
    • 1.5 注解与习题

第一章 程序入门设计

1.1 算数表达式

程序1-2:计算并输出8/5的值,保留小数点后1位

#include
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
#include
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
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
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
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
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
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
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
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
#include
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
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
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
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)

你可能感兴趣的:(蓝桥杯备考——算法竞赛入门经典(第2版)学习笔记1)