1. 程式人生 > >1024 科學計數法 (20 分)

1024 科學計數法 (20 分)

正則 一行 code 是否 情況 -html 科學計數法 編寫 int

科學計數法是科學家用來表示很大或很小的數字的一種方便的方法,其滿足正則表達式 [+-][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

分析:首先判斷E後是正還是負,正沒有小數點加0,負繼續進行判斷
這個題目比較麻煩的一點在小數點上,主要有三種情況
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
string a;
char s1[10000];
int s2[10000];
cin>>a;
int flag,i=1;
int l=a.length();
for(i=1;i<l;i++)
{
if(a[i]==‘E‘)
{
flag=i+1;
break;
}
}
if(a[0]==‘-‘)
{
cout<<a[0];
}
int k=0,j;
for(int i=1;i<flag-1;i++) //截取左邊的數
{
if(a[i]!=‘.‘)
{
s1[k++]=a[i];
}
}
s1[k]=‘\0‘;
for(i=flag+1,j=0;i<l;i++) //截取指數
{
s2[j++]=a[i]-‘0‘;
}
int num=0;
// for(int i=flag+1,j=0;i<l;i++) //可以直接求num,寫的太麻煩了,又定義了一個數組存數字,費時費力
// {
// num=num*10+s2[i]-‘0‘;
// }
for(int i=0;i<l-flag-1;i++)
{
num=num*10+s2[i];
}
// cout<<num<<endl;
if(num==0)
{
if(a[0]!=‘+‘)
{
cout<<a[0];
}
cout<<s1;
}
else if(a[flag]==‘+‘)
{
if(k-1>num) //要判斷左邊小數點後的數字長度和指數是否相等
{
for(int i=0;i<num+1;i++)
cout<<s1[i];
cout<<‘.‘;
for(int i=num+1;i<k;i++)
cout<<s1[i];
}
else if(k-1==num) //如果相等不輸出小數點
{
cout<<s1;
}
else
{
cout<<s1;
for(int i=0;i<num-1;i++)
cout<<‘0‘;
}
}
else
{
cout<<"0.";
for(int i=1;i<num;i++)
cout<<‘0‘;
cout<<s1<<endl; }
}
//分為三種情況,指數=0,指數>0,指數<0
//指數>0又分為三種情況,指數和小數點後數字長度比較

1024 科學計數法 (20 分)