题目:http://pat.zju.edu.cn/contests/pat-b-practise/1024
题解:
将输入的科学计数法数字转换为正常的数字。
分子分母至少有1位。
按指数的正负分情况处理即可。
代码:
#include<cstdio> #include<cstring> #include<cmath> #include<string> #include<vector> #include<map> #include<set> #include<algorithm> using namespace std; int charToInt(char *x) { int len=strlen(x); int summ=0; for(int i=0; i<len; ++i) { summ*=10; summ+=(x[i]-'0'); } return summ; } int main() { char ch[210000]; char a[200000];//底数 char b[10000];//指数 char flagA,flagB;//符号 int lenA=0,lenB=0,lenC,intB; int idx=-1;//点的位置 scanf("%s",ch); flagA=ch[0]; lenC=strlen(ch); bool flag=true; for(int i=1; i<lenC; ++i) { if(ch[i]=='.') { idx=i-1; } else if(ch[i]=='E') { flag=false; } else if(ch[i]=='+'||ch[i]=='-') { flagB=ch[i]; } else if(flag) { a[lenA++]=ch[i]; } else { b[lenB++]=ch[i]; } } intB=charToInt(b); if(flagA=='-') printf("-"); //printf("%d %d %d %d\n",lenA,lenB,idx,intB); if(flagB=='+') { flag=false; idx+=intB; for(int i=1; i<=lenA; ++i) { if(i<idx) { if(a[i-1]=='0'&&flag==false) continue; else { printf("%c",a[i-1]); flag=true; } } else if(i==idx) { if(i==lenA) printf("%c",a[i-1]); else printf("%c.",a[i-1]); } else printf("%c",a[i-1]); } for(int i=0; i<idx-lenA; ++i) printf("0"); } else { flag=false; idx-=intB; if(idx<=0) { printf("0."); for(int i=0; i<-idx; ++i) printf("0"); for(int i=0; i<lenA; ++i) printf("%c",a[i]); } else { for(int i=1; i<=lenA; ++i) { if(i<idx) { if(a[i-1]=='0'&&flag==false) continue; else { printf("%c",a[i-1]); flag=true; } } else if(i==idx) { printf("%c.",a[i-1]); } else printf("%c",a[i-1]); } } } return 0; }