把浮点型数值用科学计数法输出

21 篇文章 0 订阅
20 篇文章 1 订阅
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>

using namespace std;
struct SCINUM { // 科学计数法结构体
	string valid_num; //有效位
	int index;//指数
	SCINUM() {
		index = 0; // 10^index 
	}
};

//将string表示的浮点数转化为科学表示法的数值
//valid_cnt保留的有效位数
SCINUM str2Sci(string num, int valid_cnt) {
	SCINUM scinum;
	int dot_pos, nzero_pos; // dot_pos:小数点位置、 nzero_pos:第一个非零数值的位置

	//找到小数点的位置
	dot_pos = num.find("."); 
	if (dot_pos == string::npos)//没有小数点,小数点就在最后一个位置
		dot_pos = num.size();

	//找到第一个非零数字的位置
	nzero_pos = 0;
	while (nzero_pos < num.size() && (num[nzero_pos] == '0' || num[nzero_pos] == '.'))
		nzero_pos++;

	//如果上面找到的都是0,那么这是数是零,可以直接返回
	if (nzero_pos == num.size()) {
		while (scinum.valid_num.size() < valid_cnt)//在后面补够有效位数
			scinum.valid_num.push_back('0');//补‘0’
		return scinum; //返回
	}

	//求出小数点需要移动的位数,即求指数的大小
	scinum.index = dot_pos - nzero_pos;//小数点位置-非零数值的位置
	if (dot_pos < nzero_pos)scinum.index++;

	//把有效位存储到scinum里面的valid_num
	for (int i = nzero_pos; i < num.size() && scinum.valid_num.size() < valid_cnt; i++) {
		if (num[i] != '.')scinum.valid_num += num[i];
	}
	//补‘0’,筹够有效位数
	while (scinum.valid_num.size() < valid_cnt)
		scinum.valid_num.push_back('0');
	return scinum;
}

PAT题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805413520719872

int main() {
	string str1, str2;
	int cnt;
	cin >> cnt >> str1 >> str2;
	SCINUM scinum1, scinum2;
	scinum1 = str2Sci(str1, cnt);
	scinum2 = str2Sci(str2, cnt);

	if (scinum1.valid_num == scinum2.valid_num && scinum1.pow == scinum2.pow) {
		printf("YES 0.%s*10^%d\n", scinum1.valid_num.c_str(), scinum1.pow);
	}
	else {
		printf("NO 0.%s*10^%d 0.%s*10^%d\n", scinum1.valid_num.c_str(), scinum1.pow, scinum2.valid_num.c_str(), scinum2.pow);
	}
	return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值