程序的基本组成(附加题,选做)
第一关
任务描述 本关任务:编写程序实现除法向上取整。 给定两个正整数$n,m$,$[n/m]$ 表示大于等于 $n/m$ 的最小整数。求$[n/m]$。
相关知识
为了完成本关任务,你需要掌握:除法整除,C++数学运算。
编程要求
根据提示,在右侧编辑器补充代码。
输入格式 一行,两个正整数n,m,(1<=n,m<=1000000000)。
输出格式 一行,表示答案
样例输入 3 2
样例输出 2
样例代码
#include <iostream>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
if (n%m==0) cout<<n/m;
else cout<<n/m+1;
return 0;
}
第二关
任务描述 本关任务:编程求点$(x_{0},y_{0})$到直线$Ax+By+C=0$的距离。
相关知识
为了完成本关任务,你需要掌握:
点到直线的距离公式 dist $=\frac{A x_{0}+B y_{0}+C}{\sqrt{A^{2}+B^{2}}}$ C++数学运算
编程要求
根据提示,在右侧编辑器补充代码。
输入格式 一行,五个整数 x0 y0 A B C。 保证所有输入的整数的绝对值不超过100。
输出格式 一行,输出距离,保留小数点后3位。
样例输入 1 1 1 1 0
样例输出 1.414
样例代码
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main(void) {
int x,y,a,b,c;
cin>>x>>y>>a>>b>>c;
double res = (a*x+b*y+c)/(sqrt(a*a+b*b));
cout<<setiosflags(ios::fixed)<<setprecision(3)<<abs(res);
return 0;
}
第三关
任务描述 本关任务:编写一个能计算圆面积并的小程序。
| 假设给定两个圆,第一个圆圆心为 $\left(x_{1}, y_{1}\right),$ 半径为 $r_{1},$ 第二个圆圆心为 $\left(x_{2}, y_{2}\right),$ 半径为 $r_{2}$ 。满足 $r_{1}+r_{2}>\sqrt{\left(x_{1}-x_{2}\right)^{2}+\left(y_{1}-y_{2}\right)^{2}}>\left | r_{1}-r_{2}\right | $ 。即两个圆相交的情况。计算两个圆的面积并。 |
相关知识
为了完成本关任务,你需要掌握:1.圆面积并的求法。2.C++数学运算。
圆面积并 注意可能存在两种情况。但是两种情况是可以合并的(即不需要分支语句)。 圆面积并 这里提供一个可行的思路: 首先把整体的面积为两个圆的面积和减去重合的部分。 重合的部分总是可以看成是两个扇形的和(哪两个?)减去两个三角形的和(哪两个?)。
C++数学运算 (cmath库)一些可能用得上的函数的原型:
double sqrt(double x); //求根
double sin(double x); //求sin(x)
double cos(double x); //求cos(x)
double tan(double x); //求tan(x)
double asin(double x); //求arcsin(x)
double acos(double x); //求arccos(x)
double atan(double x); //求arctan(x)
double atan2(double y, double x) //返回向量(x,y)与 x 轴的夹角(弧度)。取值范围为(-pi,pi]。
编程要求
根据提示,在右侧编辑器补充代码。
输入格式 一行,六个正整数x1,y1,r1,x2,y2,r2。 保证全部输入不超过100。保证两圆相交。
输出格式 一行,输出面积并。保留小数点后3位小数。
样例输入 1 1 1 1 2 1
样例输出 5.055
样例代码
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main(void) {
double pi = 3.1415926;
int x1,y1,r1,x2,y2,r2;
cin>>x1>>y1>>r1>>x2>>y2>>r2;
double dist_o1_o2 = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
double theta_1 = 2*acos((r1*r1+dist_o1_o2*dist_o1_o2-r2*r2)/(2*r1*dist_o1_o2));
double theta_2 = 2*acos((r2*r2+dist_o1_o2*dist_o1_o2-r1*r1)/(2*r2*dist_o1_o2));
double theta = acos((r2*r2+r1*r1-dist_o1_o2*dist_o1_o2)/(2*r2*r1));
double s = 0.5*r1*r1*theta_1 + 0.5*r2*r2*theta_2 - sin(theta)*r1*r2;
cout<<setiosflags(ios::fixed)<<setprecision(3)<<pi*r1*r1+pi*r2*r2-s;
return 0;
}
第四关
任务描述 本关任务:编写一个程序,给定n,计算下面的式子。 $\sum_{i=1}^{n} \sum_{j=1}^{n} \min (i, j)+\sum_{i=1}^{n} \sum_{j=1}^{n} \max (i, j)$ 这是一道数学题,可以通过计算得到最后的结果,不需要使用循环。
相关知识
为了完成本关任务,你需要掌握:C++数学运算。
注意各类型的范围 一般情况下:
- short为[-32768,32767],估算时可以简单记为±3e4;
- int为[-2147483648,2147483647],估算时可以简单记为±2e9;
- long long为[-9223372036854775808,9223372036854775807],估算时可以简单记为±9e18。
编程要求
根据提示,在右侧编辑器补充代码。
输入格式 一行,一个正整数n,保证n<=1000000(即1e6)。
输出格式 一行,输出答案。
样例输入 10
样例输出 1100
样例代码
#include <iostream>
#include <cmath>
using namespace std;
int main(void) {
/******** Begin ********/
long long a;
cin>>a;
long long res = (1+a)*a*a;
cout<<res;
/******** End ********/
return 0;
}