第一章 程序设计入门
学习要求和笔记:
√ 熟悉C程序的编译和运行
√ 学会编程计算并输出常见的算术表达式的结果
√ 掌握整数和浮点数的含义和输出方法、声明和读入方法
√ 掌握数学函数的使用方法
√ 初步了解变量的含义
》尽量用const关键字声明常数
√ 掌握变量交换的三变量法
√ 理解算法竞赛中的程序三步曲:输入、计算、输出
√ 记住算法竞赛的目标及对程序的要求
》在算法竞赛中,输入前不要打印任何提示信息,例如Please input n: 这样会被当做输出数据的一部分
》在算法竞赛中不要使用头文件conio.h,包括getch(),clrscr()等函数
例题学习记录和源代码:
√ Example1-1 圆柱的表面积
√ Example1-2 三位数反转
√ Example1-3 交换变量
》中间变量法
》非中间变量法
》a^=b^=a^=b
√ Example1-4 鸡兔同笼
√ Example1-5 三整数排序
习题学习记录和源代码:
√ Exercise1-1 平均数
√ Exercise1-2 温度
√ Exercise1-3 连续和
√ Exercise1-4 正弦和余弦
√ Exercise1-5 打折
√ Exercise1-6 三角形
√ Exercise1-7 年份
//Example1-1 圆柱的表面积:
/**
* 题目名称:圆柱体的表面积
* 题目描述:输入底面积半径为r和高h,输出圆柱体的表面积,保留3位小数
* 样例输入:3.5 9
* 样例输出:Area = 274.889
**/
/**学习笔记
* pi的定义方法double pi = acos(-1.0)
* double型输入要记得%lf;
* s = s1*2.0 + s2 要记得把2写成2.0
**/
#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;
}
//Example1-2 三位数反转:
/**
* 题目名称:三位数反转
* 题目描述:输入一个三位数,分离出它的百位、十位、个位,反转后输出
* 样例输入:127
* 样例输出:721
**/
/**学习笔记
* 三位数读入变量中,之后分离,百位为n/100,十位为n/10%10,个位为n%10
* 如果个位数为0时,反转时候就出现第一个数字是0了,这个时候得看清题目
* printf("%03d\n", m) 不够三位则右对齐,前面加0,如果想要输出字符"%"应该再格式控制字符串连续用两个%表示,printf("%f%%", 1.0/3) 输出0.333333%
* printf("%d%d%d\n", n%10, n/10%10, n/100);单个分离输出也是一种新的思路
**/
#include <stdio.h>
int main()
{
int n,m;
scanf("%d", &n);
m = (n%10)*100 + (n/10%10)*10 + (n/100);
printf("%03d\n", m);
return 0;
}
//Example1-3 交换变量1间变量法:
/**
* 题目名称:交换变量
* 题目描述:输入两个整数a和b,交换两者的值,之后输出
* 样例输入:824 16
* 样例输出:16 824
**/
/**学习笔记
* 三变量法:比喻成将一瓶酱油和一瓶醋借助一个空瓶子来进行交换
**/
#include <stdio.h>
int main()
{
int a, b, t;
scanf("%d%d", &a, &b);
t = a;
a = b;
b = t;
printf("%d %d\n",a,b);
return 0;
}
//.cpp
#include <iostream>
using namespace std;
int main()
{
int a,b,t;
cin >> a >> b;
t = a;
a = b;
b = t;
cout << a << b << endl;
return 0;
}
//Example1-3 交换变量1非中间变量法:
/**
* 题目名称:交换变量
* 题目描述:输入两个整数a和b,交换两者的值,之后输出
* 样例输入:824 16
* 样例输出:16 824
**/
/**学习笔记
* 非三变量法:可以比喻成将硬着头皮把醋倒在酱油瓶子里,之后再分离出酱油倒回醋瓶子
* 过程:假定输入a0和b0,
* 执行完a = a + b后:a = a0 + b0, b = b0;
* 执行完b = a - b后:a = a0 + b0, b = a0;
* 执行完a = a - b后:a = b0, b = a0;
**/
#include <stdio.h>
int main()
{
int a, b, t;
scanf("%d%d", &a, &b);
a = a + b;
b = a - b;
a = a - b;
printf("%d %d\n",a,b);
return 0;
}
//.cpp
#include <iostream>
using namespace std;
int main()
{
int a,b,t;
cin >> a >> b;
a = a + b;
b = a - b;
a = a - b;
cout << a << b << endl;
return 0;
}
//Example1-4 鸡兔同笼:
/**
* 题目名称:鸡兔同笼
* 题目描述:已知鸡和兔的总数量为n,总腿数为m。输入n和m依次输出鸡的数目和兔的数目。 如果无解,则输出 No answer
* 样例输入: 14 32
* 样例输出: 12 2
* 样例输入: 10 16
* 样例输出: No answer
**/
/**学习笔记与题目分析
* 题目分析:
* 此题可以理解为解二元一次方程的数学题,鸡的数目为a, 兔的数目为b。
* 则: 4*b+2*a= m, a+b=n,解得:a=(4n-m)/2, b=n-a.
* 此外:考虑无解的情况,1:总腿数需要满足为偶数,2:鸡兔数目为正数。
**/
#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;
}
//.cpp
#include <iostream>
using namespace std;
int main()
{
int a,b,n,m;
while(cin >> n >> m)
{
int a,b;
a = (4*n - m)/2;
b = n - a;
if(m % 2 == 1 || a < 0 || b < 0)
cout << "No answer" << endl;
else
cout << a << " " << b << endl;
}
return 0;
}
//Example1-5 三整数排序情况列举法:
/**
* 题目名称:三整数排序
* 题目描述:输入3个整数,从小到大排序后输出。
* 样例输入:26 78 12
* 样例输出:12 26 78
**/
/**学习笔记与题目分析
* 如果有多个并列、情况不交叉的条件需要一一处理,可以用else if语句。
* 题目分析:
* 排序方法,逐情况列举,这种方法有点笨,不过也是很容易想出的方法。
* 如果有三个整数,那么,它就会有3*2*1+1种情况,
* 第一个数可取3种情况,最大,最小,中等。
* 那么第二个数就是,剩下的2种情况。
* 第三个数,没有其它可选,剩下1种情况。
**/
#include <stdio.h>
int main()
{
int a,b,c;
scanf("%d%d%d", &a, &b, &c);
if(a <= b && b <= c) printf("%d %d %d\n", a, b, c);
else if(a <= c && c <= b) printf("%d %d %d\n", a, c, b);
else if(b <= c && c <= a) printf("%d %d %d\n", b, c, a);
else if(b <= a && a <= c) printf("%d %d %d\n", b, a, c);
else if(c <= a && a <= b) printf("%d %d %d\n", c, a, b);
else if(c <= b && b <= a) printf("%d %d %d\n", c, b, a);
return 0;
}
//Example1-5 三整数排序比较交换法:
/**
* 题目名称:三整数排序
* 题目描述:输入3个整数,从小到大排序后输出。
* 样例输入:26 78 12
* 样例输出:12 26 78
**/
/**学习笔记与题目分析
* 题目分析:
* 排序方法,比较交换法
* 首先检查a和b的值,如果a>b,则交换a和b(利用前面说的三变量交换法)
* 之后检查a和c,同理交换法
* 最后检查b和c
**/
//.cpp
#include <iostream>
using namespace std;
int main()
{
int a,b,c,t;
cin >> 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;}
cout << a << " " << b << " " << c << endl;
return 0;
}
//.c
#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", a, b, c);
return 0;
}
// Exercise1-1 平均数(average)
/**
* 题目要求:输入3个整数,输出它们的平均值,保留3位小数。
* 学习笔记:c中可以采用printf("%.3f", data);来保留小数点位数;
* 在C++中需要用格式控制符或者成员函数precision,格式控制符需要加上头文件#include<iomanip>
* 格式控制符setprecision(n) 设置显示小数精度为n位,setiosflags(ios::fixed) 固定的浮点显示搭配使用
* C语言中输入输出double要用lf
**/
//.cpp
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double a,b,c;
cin >> a >> b >> c;
cout << setiosflags(ios::fixed) << setprecision(3) << (a + b + c)/3 << endl;
return 0;
}
//.c
#include <stdio.h>
int main()
{
double a, b, c;
scanf("%lf%lf%lf", &a, &b, &c);
printf("%.3f\n", (a + b + c)/3); //这里需要注意一个小细节,就是实际上这里应该左对齐的,变成%-.3f
return 0;
}
// Exercise1-2 温度(temperature)
/**
* 题目要求:输入华氏温度f,输出对应的摄氏温度c,保留3位小数。
* 提示:c = 5 * (f - 32) / 9;
**/
//.cpp
/*
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double f;
cin >> f;
cout << setiosflags(ios::fixed) << setprecision(3) << 5 * (f - 32) /9 << endl;
return 0;
}
*/
//.c
#include <stdio.h>
int main()
{
double f;
scanf("%lf", &f);
printf("%.3lf\n", 5 * (f - 32) /9);
return 0;
}
// Exercise1-3 连续和(sum)
/**
* 题目要求:输入正整数n,输出 1+2+...+n的值。
* 题目分析:可以采用循环来处理,也可以利用数学知识n*(n+1)/2来直接计算
* 学习笔记,这里要防止溢出了,所以用long long型
**/
//.cpp
#include <iostream>
using namespace std;
int main()
{
long long n;
cin >> n;
cout << n*(n+1)/2 << endl;
return 0;
}
//.c
#include <stdio.h>
int main()
{
long long n;
scanf("%d", &n);
printf("%d\n", n*(n+1)/2);
return 0;
}
// Exercise1-4_正弦和余弦(sincos)
/**
* 题目要求:输入正整数n(n<360),输出n度的正弦、余弦函数值。
* 学习笔记:sin,cos可以调用数学函数,但必须记得头文件#include<cmath.h>;math.h是C语言的头文件。
* 其实在C++中用math.h也是可以的,C++是兼容C的。
* 或者命名const double pi = acos(-1.0) 之后再把角度转换为n/180.0 * pi
**/
//.cpp
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
double n;
const double pi = acos(-1.0);
cin >> n;
cout << sin(n/180*pi) << " " << cos(n/180*pi) << endl;
return 0;
}
//.c
#include <stdio.h>
#include <math.h>
int main()
{
double n;
scanf("%lf", &n);
const double pi = acos(-1.0);
printf("%lf %lf\n", sin(n/180*pi),cos(n/180*pi));
return 0;
}
// Exercise1-5_打折(discount).cpp
/**
* 题目要求:一件衣服95元,若消费满300元,可打八五折。
* 输入购买衣服件数,输出需要支付的金额(单位:元),保留两位小数。
**/
/*
//.cpp
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
const double singleConsume = 95.0;
const double discount = 0.85;
const double sumConsume = 300.0;
double number;
cin >> number;
double sum = number * singleConsume;
if(sumConsume < sum)
{
sum *= discount;
}
cout << setiosflags(ios::fixed) << setprecision(2) << sum << endl;
return 0;
}
*/
//.c
#include <stdio.h>
int main()
{
const double singleConsume = 95.0;
const double discount = 0.85;
const double sumConsume = 300.0;
double number;
scanf("%lf", &number);
double sum = number * singleConsume;
if(sumConsume < sum)
{
sum *= discount;
}
printf("%-.2f\n", sum);
return 0;
}
// Exercise1-6 三角形(triangle).cpp
/**
* 题目要求:输入三角形三边长度值(均为正整数),判断它是否能为直角三角形的三个边长。
* 如果可以,则输出“yes”,如果不能,则输出“no”。
* 如果根本无法构成三角形,则输出“not a triangle”。
**/
/**
* 题目分析:
* 对于这题,可以先判断是否三角形,然后再进行下一步的判断,判断是否能构成直接三角形。
* 判断三角形:两边之和大于第三边即可判断。
* 判断是否直角三角形:可以用勾股定理,不过前提得先利用交换的思想判断出最大边是哪一条。
**/
/*
//.cpp
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
cin >> a >> b >> c;
if(a > b + c || b > a + c || c > a + b)
cout << "not a triangle" << endl;
int t;
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;}
if(c*c == a*a + b*b)
cout << "yes" << endl;
else
cout << "no" << endl;
return 0;
}
*/
//.c
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d%d%d", &a, &b, &c);
if(a > b + c || b > a + c || c > a + b)
printf("not a triangle");
int t;
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;}
if(c*c == a*a + b*b)
printf("yes");
else
printf("no");
return 0;
}
// Exercise1-7 闰年(leapYear).cpp
/**
* 题目要求:输入年份,判断是否闰年。
* 如果是,则输出“yes”,否则输出“no”。
**/
/**
* 题目分析:首先得知道常识是:平年365天,闰年366天。
* 计算方法:公历闰年的精确计算方法(按一回归年365天5小时48分45.5秒)
* ① 普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年)
* ② 世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
* 程序编写思路:
* ① 再判断数值是否满足第2个条件(世纪年),判断是否闰年。
* ② 最后使用普通年的判断方法以判断是否闰年。
**/
/*
//.cpp
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
if(n % 400 == 0)
cout << "yes" << endl;
else if(n % 4 == 0 && n % 100 != 0)
cout << "yes" << endl;
else
cout << "no" << endl;
return 0;
}
*/
//.c
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
if(n % 400 == 0)
printf("yes\n");
else if(n % 4 == 0 && n % 100 != 0)
printf("yes\n");
else if
printf("no\n");
return 0;
}
// Thinking1-1 计算int型整数的最小值和最大值.cpp
/**
* 计算方法:
* 最小值:当int型的数据到了最小值时,然后再减1(即越界时),它会变成正数,
* 如果此时再将此数值加1,就可以知道这最小值是多少了。
* 最大值:同理,当int型的数据到了最大值时,然后再加1(即越界时),它会变成负数,
* 如果此时再将此数值减1,就可以知道这最大值是多少了。
* 运行结果:-2147483648 2147483647
**/
//.cpp
#include <iostream>
using namespace std;
int int_min()
{
int n = 0;
while(n <= 0)
{
n--;
}
n++;
return n;
}
int int_max()
{
int n = 0;
while(n >= 0)
{
n++;
}
n--;
return n;
}
int main()
{
int min=0,max=0;
cout << int_min() << " " << int_max() << endl;
return 0;
}
——To_捭阖_youth 2014.6.27