AT_abc001C 風力観測
一、题目描述
给两个输入,一个是风向,一个是风力,要求以另一种表示形式输出它们。
二、算法分析
总体是一道模拟题,考察了浮点数的四舍五入。
以 5.23 为例,对小数点后第 2 位进行四舍五入,即保留小数点后 1 位。
- 将小数点后第 2 位加 5.
- 得 5.28
- 将小数点移到第 2 位之前的一位。
- 得 52.8
- 取整。(此处注意加上误差,四舍五入的误差限不超过最后一位的半个单位)
- 得 52
- 转换为小数。
- 得 52.0
- 小数点移回去。
- 得 5.2
三、代码及注释
cpp
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int a;
double b;
double ad(double x,int p){ //对x的小数点后p位进行四舍五入(即保留小数点后p-1位)
double eps=0.5*pow(10,p*(-1)); //四舍五入的误差限不超过最后一位的半个单位
x+=5.0/pow(10,p); //先在小数点后第p位加上5
double w=(int)(x*pow(10,p-1)+eps); //然后把小数点移到第p位前一位
double res=w;
res=res/pow(10,p-1);
return res;
}
int main(){
cin>>a>>b;
//计算风向,此时直接用题目给出的整数即可
string s;
if(a<=112) s="N";
else if(a<=337) s="NNE";
else if(a<=562) s="NE";
else if(a<=787) s="ENE";
else if(a<=1012) s="E";
else if(a<=1237) s="ESE";
else if(a<=1462) s="SE";
else if(a<=1687) s="SSE";
else if(a<=1912) s="S";
else if(a<=2137) s="SSW";
else if(a<=2362) s="SW";
else if(a<=2587) s="WSW";
else if(a<=2812) s="W";
else if(a<=3037) s="WNW";
else if(a<=3262) s="NW";
else if(a<=3487) s="NNW";
else s="N";
//计算风力
double c=ad((b/60),2); //题目输入的是每分钟的风程,要转化为每秒的,然后四舍五入
int d=0; //风力等级
if(c<=0.2) d=0,s="C";
else if(c<=1.5) d=1;
else if(c<=3.3) d=2;
else if(c<=5.4) d=3;
else if(c<=7.9) d=4;
else if(c<=10.7) d=5;
else if(c<=13.8) d=6;
else if(c<=17.1) d=7;
else if(c<=20.7) d=8;
else if(c<=24.4) d=9;
else if(c<=28.4) d=10;
else if(c<=32.6) d=11;
else d=12;
cout<<s<<" "<<d<<endl;
return 0;
}