//412k 0ms
#include <cstdio>
#include <cmath>
#define HUM(d, t) (6.11 * exp(5417.7530 * ((1 / 273.16) - (1 / (d + 273.16)))) - 10.0) * 0.5555 + t
#define DEW(h, t) (1 / ((log(((h - t) / 0.5555 + 10.0) / 6.11) / 5417.7530) * (-1) + (1 / 273.16)) - 273.16)
#define TEP(d, h) (h - ((6.11 * exp(5417.7530 * ((1 / 273.16) - (1 / (d + 273.16))))) - 10.0) * 0.5555)
int main() {
float t, d, h;
float n[2];
char c[2];
while (scanf("%c %f %c %f", c, n, c + 1, n + 1) == 4) {
t = d = h = 101;
for (int i = 0; i < 2; ++i) {
if (c[i] == 'D') d = n[i];
if (c[i] == 'T') t = n[i];
if (c[i] == 'H') h = n[i];
}
if (t == 101) t = TEP(d, h);
if (d == 101) d = DEW(h, t);
if (h == 101) h = HUM(d, t);
printf("T %0.1f D %0.1f H %0.1f\n", t, d, h);
scanf("\n");
}
return 0;
}
notes:
1. pow(), log(), log10(), exp()函数的使用
2. 使用题中给定的e = 2.718281828,可以pow(e, x); log(x) / log(e);
3. 使用inline函数和macro的memory一致, 说明也是简单替换, 重要的是在inline中可以调用函数。
4. scanf double需要%lf,printf double %f就行, scanf("\n")能确保读入一个\n;
5. 隐式类型转换会按操作符优先级和结合性进行,有时候会有坑。
6. float: +/- 3.4e +/- 38 (7); double +/- 1.7e +/- 308(15)
optimize:
转一段代码:
//Memory Time
//240K 0MS
#include<iostream>
#include<math.h>
#include<string>
#include<iomanip>
using namespace std;
int main(void)
{
char alpha;
double t,d,h;
int i;
for(;;)
{
t=d=h=200; //三个参数的范围默认都是在-100 ~ 100
for(i=0;i<2;i++)
{
cin>>alpha;
if(alpha=='E')
return 0;
else if(alpha=='T')
cin>>t;
else if(alpha=='D')
cin>>d;
else if(alpha=='H')
cin>>h;
}
if(h==200)
h=t+0.5555*(6.11*exp(5417.7530*(1/273.16-1/(d+273.16)))-10);
else if(t==200)
t=h-0.5555*(6.11*exp(5417.7530*(1/273.16-1/(d+273.16)))-10);
else if(d==200)
d=1/((1/273.16)-((log((((h-t)/0.5555)+10.0)/6.11))/5417.7530))-273.16;
cout<<setprecision(1)<<fixed<<"T "<<t<<" D "<<d<<" H "<<h<<endl;
}
return 0;
}