题目
科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式\[+-\]\[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
解析
按照小数点向左向右移位即可。
多出几组各种各样的测试样例,基本上能试出来所有的问题
代码
C++解法
#include <cmath> #include <cstdio> #include<cstring> const int maxn = 10010; char s[maxn]; char base[maxn]; /* Find the first character c in the string s. Arguments: s - string len - length of s c - the character to find Return: The position of the character in the string. If cann't find the character, return -1. */ int findChar(char *s,int len,char c){ int pos = -1; for(int i=0;i<len;++i){ if(s[i] == c){ pos = i; break; } } return pos; } /* Erase the nonnumeric character. Arguments: s - raw string. len - length of s. Return: Length of the string. */ int eraseNonChar(char *s, int len) { int pos=0; for (int i=0;i<len;++i){ if(s[i]>='0'&&s[i]<='9') s[i-pos] = s[i]; else ++pos; } s[len-pos]='\0'; return len-pos; } /* String to integer Arguments: s - string bpos - begin position epos - end position Return: The integer */ int toInt(char *s, int bpos,int epos){ int fix = 1; int num=0; for(int i=bpos;i<epos;++i){ if (i==bpos && (s[i]=='+'||s[i]=='-')){ if(s[i]=='-') fix = -1; }else{ if(s[i]>='0'&&s[i]<='9') num=num*10+s[i]-'0'; } } return num*fix; } /* Get the sub-string Arguments: dst - destination string src - source string bpos - begin position epos - end position Return: The integer */ void subString(char *dst, char *src, int bpos, int epos){ //memcpy(dst,src+bpos,(epos-bpos)*sizeof(char)); //printf("%s %d %d\n",src,bpos,epos); for(int i = 0;i < epos-bpos;++i) dst[i] = src[i+bpos]; dst[epos-bpos]='\0'; } int main() { scanf("%s",s); int len = strlen(s); int ePos = findChar(s,len,'E'); bool fix = false; subString(base,s,0,ePos); fix = (base[0]=='-'); int baseLen = eraseNonChar(base,strlen(base)); int exponent = toInt(s,ePos+1,len); // printf("%c %s %d\n",(fix?'-':'+'),base,exponent); if(baseLen==1 && base[0]=='0') { printf("0"); } else { if(fix) printf("-"); if(exponent<0){ for(int i=0;i<-exponent;++i){ printf("0"); if(i==0) printf("."); } printf("%s",base); }else{ bool isFirst = true; for(int i=0;i<baseLen;++i){ if(!isFirst || base[i]!='0'){ printf("%c",base[i]); isFirst = false; } if(exponent==i && i!=baseLen-1) printf("."); } for(int i=0;i<=exponent-baseLen;++i) printf("0"); } } printf("\n"); return 0; }