PAT甲题题解-1073. Scientific Notation (20)-字符串处理

时间:2023-03-10 03:30:52
PAT甲题题解-1073. Scientific Notation (20)-字符串处理

题意:给出科学计数法的格式的数字A,要求输出普通数字表示法,所有有效位都被保留,包括末尾的0。

分两种情况,一种E+,一种E-。具体情况具体分析╮(╯_╰)╭

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <cmath>
#define POSITIVE 1
#define NEGATIVE 2
using namespace std;
/*
将科学计数法表示的数转换成传统的形式输出
*/
const int maxn=;
char str[maxn];
char expval[maxn]; void printNum(char *num,int idxE,int fraclen,int e,int mark){
//指数为正
if(mark==POSITIVE){
bool flag=false;
if(num[]!=''){
flag=true;
printf("%c",num[]);
}
num+=;
int minlen=min(fraclen,e);
for(int i=;i<minlen;i++){
//前面的0直接忽略
if(num[i]!=''){
flag=true;
}
if(flag){
printf("%c",num[i]);
}
}
if(e>=fraclen){
for(int i=;i<e-fraclen;i++)
printf("");
}
else{
printf(".");
for(int i=;i<fraclen-e;i++)
printf("%c",num[minlen+i]);
}
}
//指数为负
else{
printf("0.");
for(int i=;i<e-;i++){
printf("");
}
for(int i=;num[i]!='E';i++){
if(num[i]!='.')
printf("%c",num[i]);
}
}
}
int main()
{
scanf("%s",str);
int len=strlen(str);
int idxE=;
int fracLen;
for(int i=;i<len;i++){
if(str[i]=='E'){
idxE=i; //E的索引
break;
}
}
fracLen=idxE-;//小数部分长度
int explen=;
for(int i=idxE+;i<len;i++){
expval[explen++]=str[i];
}
expval[explen]='\0';
int e=atoi(expval);
if(str[idxE+]=='+'){
if(str[]=='-')
printf("-");
printNum(str+,idxE,fracLen,e,POSITIVE); }
else{
if(str[]=='-')
printf("-");
printNum(str+,idxE,fracLen,e,NEGATIVE);
}
return ;
}