zcmu 4944: 字符串處理

【題目】

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章