题目: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;
}
来源: http://blog.csdn.net/acm_ted/article/details/20383881