算法提高 P0101
时间限制:1.0s 内存限制:256.0MB
提交此题
一个水分子的质量是3.0*10-23克,一夸脱水的质量是950克。写一个程序输入水的夸脱数n(0 <= n <= 1e10),然后输出水分子的总数。
输入
109.43
输出
3.465283E+027
分析:这道题是通过一个已知条件,让我们推出通过水的夸脱数来计算水分子的总数的公式,并转换为指数形式输出。公式如下:
r
e
s
=
n
∗
950
3.0
∗
1
0
−
23
res = \frac{n*950}{3.0*10^{-23}}
res=3.0∗10−23n∗950
代码如下:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double n;
cin >> n;
printf("%E\n", n*950/3E-23);
return 0;
}
我这里还有一个我之前不知道printf有%E时候的代码,比较青涩。
就是将输出分成两段,resE+wei的格式;。例如3.465283E+027,res = 3.465283, wei = 27;用res存前面的小数,用wei存后面10的几次幂。
由于最初公式是
950
3
∗
1
0
−
23
即
950
3
∗
1
0
23
\frac{950}{3*10^{-23}}即\frac{950}{3}*10^{23}
3∗10−23950即3950∗1023,所以我将wei初始为23,再根据
n
∗
950
3
n*\frac{950}{3}
n∗3950的结果,将其改为科学记数法的形式,即res的整数位只有个位,10的几次幂存到wei中。
其实总的来说,就是求公式,转换为科学记数法,即所谓的指数形式并输出。代码如下:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double n;
double res;
int wei = 23;
cin >> n;
res = n * 950 / 3.0;
if(res)
{
while(res * 10 < 10)
{ //小数点左移
wei--;
res *= 10;
}
while(res >= 10)
{ //小数点右移
wei++;
res /= 10;
}
}
else wei = 0; //否则res=0,wei也清0
cout << setiosflags(ios::fixed) << setprecision(6) << res << "E+" << setw(3) << setfill('0') << wei << endl;
return 0;
}
附带最后cout的解释,防止和我同样的新手对C++的cout输出格式操作函数不清楚:
cout<<(以小数形式输出)<<(小数点后6位)<<res<<“E+”<<(固定输出宽度为3)<<(不足前面填充’0’)<<wei<<endl;