题目描述
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出。
以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留。
输入
科学计数法表示的实数A。数字A的存储长度不超过9999字节,且其指数的绝对值不超过9999。
输出
按普通数字表示法输出A,并保证所有有效位都被保留,包括末尾的0。
解题思路
分析样例:
指数为负时:
+1.23400E-03 =1.2340010-03=0.00123400
指数为正时:
+1.23400E+03=1.234001003=1234.00
所以本题需要分正负来讨论。
1.当指数为正数时,将小数点后移指数位,当数字不足时,加(指数-数字长度)个0.
2.当指数位负数时,前移指数位,即在数字签名加指数位个0;
利用一个vector存储E前面的数字。
代码
#include<stdio.h>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main() {
string input;
cin >> input;
bool ispos = true;
bool first = true;
vector<char> datas;
bool index_mark = true;
int index = 0;
int point;
if (input[0] == '-')ispos = false;
for (int i = 1; i < input.size(); i++) {
if (first) {
if (input[i] == 'E') {
first = false;
if (input[i + 1] == '-')index_mark = false;
i++;
}
else if ((input[i] == '.')) {
point = i;
}
else{
datas.push_back(input[i]);
}
}
else {
index = index * 10 + input[i]-'0';
}
}
cout << index << endl;
//int len = datas.size();
if (!ispos)cout << "-";
if (index_mark) {
for (int i = 0; i < index; i++) {
if (i < datas.size()) {
cout << datas[i];
}
else {
cout << "0";
}
}
if (index < datas.size()) {
cout << ".";
for (int i = index; i < datas.size(); i++) {
cout << datas[i];
}
}
cout << endl;
}
else {
//cout << "-0.";
for (int i = 0; i < index; i++) {
if (i == 0) {
cout << "0.";
}
else {
cout << "0";
}
}
for (int i = 0; i < datas.size(); i++) {
cout << datas[i];
}
cout << endl;
}
return 0;
}
是6J,爱吃爱玩爱笑的非典型程序~~~媛
网友评论