【題目】
4944: 字符串處理
Time Limit: 1 Sec Memory Limit: 32 MB
Submit: 108 Solved: 45
[Submit][Status][Web Board]
Description
讀入兩個字符串,字符串除了數字還可能包括 '—'、'E'、'e'、'.',相加之後輸出結果,如果是浮點型,要求用科學計數法表示(最多包含10個有效數字)。
Input
輸入包含多組測試數據。
每組輸入佔兩行,每行一個字符串,測試數據保證字符串的構成嚴格按照題目中的描述。
Output
輸出兩個數字相加的結果,每組輸出佔一行。
Sample Input
34.56
2.45e2
Sample Output
2.7956e2
【題意】
兩數求和,若爲浮點數則以科學計數法形式輸出。
【思路】
以字符串形式存入,預處理兩個字符串將e前後邊的數值分離,並記錄兩數小數點後的位數和e後邊相乘的位數相抵的結果,將兩數化成原始形式擴大相同倍數使得去掉小數點並相加,如果是0或者整型直接輸出,否則以科學計數法輸出。
【代碼】
#include<bits/stdc++.h>
using namespace std;
int flag,c;
long long solve(char *str,int *a)
{
flag=0; //記錄正負
c=0; *a=0;
long long s=0; int b;
for(int i=0;str[i];i++)
{
if(str[i]=='-') flag=1;
else if(str[i]=='.') c=1; //存在小數點,c由0->1
else if(str[i]=='e'||str[i]=='E')
{
sscanf(str+i+1,"%d",&b); //b中存儲e後邊的數值
*a+=b; //小數點後的位數和e後邊相乘的位數相抵
break;
}
else
{
s=s*10+str[i]-'0'; //e前邊的字符一步步轉數值
*a-=c; //記錄小數點後的位數
}
}
if(flag) s=-s;
return s; //返回e前邊的數值
}
int main()
{
char str1[50],str2[50];
long long s,s1,s2,ans;
int a1,a2,a,w,flag;
while(~scanf("%s%s",str1,str2))
{
//預處理兩個字符串並得到相應的a(見上邊的註釋)
s1=solve(str1,&a1);
s2=solve(str2,&a2);
//把e換算回來並同時擴大相同倍數
if(a1<a2)
{
for(;a1<a2;a2--) s2*=10;
}
else if(a1>a2)
{
for(;a1>a2;a1--) s1*=10;
}
a=a1; s=s1+s2;
if(!s) //和爲0直接輸出0並跳出循環
{
printf("0\n");
continue;
}
while(a<0&&s%10==0)
{
s/=10; a++;
}
if(a>=0) //非浮點型
{
printf("%lld",s);
for(int i=0;i<a;i++) printf("0");
puts(""); continue;
}
flag=0; //flag記錄求和結果的正負
if(s<0)
{
s=-s; flag=1;
}
ans=1,w=0;
while(ans<=s)
{
ans*=10; w++;
}
if(ans>1)
{
ans/=10; w--;
}
if(flag) printf("-"); //負數輸出'-'
printf("%lld",s/ans); //輸出小數點前邊的數值
if(ans>1) printf(".%lld",s%ans); //輸出小數點後邊的數值
printf("e%d\n",a+w); //輸出e後邊的數值
}
return 0;
}