题目
/*
1024. 科学计数法 (20)
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出。
现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留。
输入格式:
每个输入包含1个测试用例,即一个以科学计数法表示的实数A。该数字的存储长度不超过9999字节,且其指数的绝对值不超过9999。
输出格式:
对每个测试用例,在一行中按普通数字表示法输出A,并保证所有有效位都被保留,包括末尾的0。
输入样例1:
+1.23400E-03
输出样例1:
0.00123400
输入样例2:
-1.2E+10
输出样例2:
-12000000000
*/
思路
// 符号原样输出
// 有效数字保存到字符串
// 根据后面数字的正负
// 如果是正数,加点或加零。
// 如果是负数,加零再加点。
// 什么是有效位?1.234 00 中00 也是有效位?
代码
1、方法一
#include <stdio.h>
#include <string>
#include <iostream>
#include <string.h>
using namespace std;
int main(){
// while(1){
// 输出符号
char sign;
cin >> sign;
if(sign == '-')cout << sign;
// 得到有效数字串、指数符号、指数
char num[10005];
char signE;
char e[10005];
scanf("%s",num);
int len = (int)strlen(num);
int j = 0;
int tag = -1;
for (int i = 0; i < len; ++i) {
if (tag == 1)e[j++] = num[i];
if (tag == 0) {
signE = num[i];
tag = 1;
}
if (num[i] == 'E') {
num[i] = 0;
tag = 0;
}
}
e[j]=0;
// scanf("%sE%c%s",num,&signE,e);
// cin.getline(num,10000,'E');
// cin >> signE;
// cin.getline(e, 10000);
string numStr = num;
int eInt = atoi(e);
numStr.erase(numStr.begin()+1);
if(signE == '+'){
if (eInt < numStr.length() - 1) {
numStr.insert(eInt+1,".");
}else if (eInt > numStr.length() - 1){
numStr.append(eInt - numStr.length() + 1 , '0');
}
// // 去掉开头多余的0
// //如果不是字符串开头有零,并且零的后面没有'.'也不是末尾
// int i = 0;
//
// while (i < numStr.length() && numStr[i] == '0') {
// if (i + 1 == numStr.length() || ((i + 1 != numStr.length()) && numStr[i+1] == '.')) {
// break;
// }
// numStr.erase(numStr.begin());
// }
}else{
if (eInt >= 1) {
numStr.insert(0, eInt, '0');
}
numStr.insert(1, ".");
}
cout << numStr << endl;
// }
}
2、方法二 | 使用正则输入
#include <stdio.h>
#include <string>
#include <iostream>
#include <string.h>
using namespace std;
int main(){
// 输出符号
char sign;
cin >> sign;
if(sign == '-')cout << sign;
// 得到有效数字串、指数符号、指数
char num[10005];
char signE;
char e[10005];
char gewei;
// 符号、个位、.、小数、E、符号、指数
scanf("%c.%[0-9]E%c%[0-9]",&gewei,num+1,&signE,e);
num[0]=gewei;
string numStr = num;
int eInt = atoi(e);
if(signE == '+'){
if (eInt < numStr.length() - 1) {
numStr.insert(eInt+1,".");
}else if (eInt > numStr.length() - 1){
numStr.append(eInt - numStr.length() + 1 , '0');
}
}else{
if (eInt >= 1) {
numStr.insert(0, eInt, '0');
}
numStr.insert(1, ".");
}
cout << numStr << endl;
}