蓝桥杯 算法提高 ADV-238 P0101 水分子数问题

算法提高 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.01023n950
代码如下:

#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} 3102395039501023,所以我将wei初始为23,再根据 n ∗ 950 3 n*\frac{950}{3} n3950的结果,将其改为科学记数法的形式,即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;

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值