【算法笔记第6.3节 string 】问题 A: 字符串处理(未解决)

题目描述

读入两个字符串,字符串除了数字还可能包括 '—'、'E'、'e'、'.',相加之后输出结果,如果是浮点型,要求用科学计数法表示(最多包含10个有效数字)。

输入

输入包含多组测试数据。

每组输入占两行,每行一个字符串,测试数据保证字符串的构成严格按照题目中的描述。

输出

输出两个数字相加的结果,每组输出占一行。

样例输入

34.56
2.45e2

样例输出

2.7956e2

答案错误50%

#include<stdio.h>
#include<string>
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
/*
 - :为负数
E/e:为10的多少次方
.  :为小数
*/
string change(string s, int &e)
{
    int k=0;
    while(k<s.length()&&s[k]!='.')
        k++;
    if(k < s.length())//有小数点
    {
        s.erase(s.begin()+k);
        while(k<s.length())
        {
            k++;
            e--;
        }
    }
    return s;
}
int  check(string &s)
{
    if(s[0]=='-')
    {
        s.erase(s.begin());
        return -1;
    }
    return 1;
}
string deal_e(string s, int &e)
{
    int k=0, fh=1;
    while(s.length()>0&&(s[k]!='e'&&s[k]!='E'))
          k++;
    //去掉e
    if(k<s.length())
    {
        int index = k;
        s.erase(s.begin()+k);
        if(s[k]=='-')
        {
            fh = -1;
            s.erase(s.begin()+k);
        }
        while(k<s.length())
        {
            e = e*10+s[k]-'0';
            k++;
        }
        s.erase(s.begin()+index, s.end());
        //s.erase(s.begin()+k, );
    }
    e*=fh;
    return s;
}
string ty(string s, int &e, int minn)
{
    while(e>minn)
    {
        s+='0';
        e--;
    }
    return s;
}
long long int change_n(string s)
{
    int n = 0, k=0;
    while(k<s.length())
    {
        n = n*10+s[k]-'0';
        k++;
    }
    return n;
}
int main()
{
    string s1, s2, s3, s4, s5,s6;
    while(cin>>s1>>s2)
    {
        int f1=1, f2=1, e1=0, e2=0;
        f1 = check(s1);//记录符号
        f2 = check(s2);

        s3 = deal_e(s1, e1);//去掉e
        s4 = deal_e(s2, e2);

        s5 = change(s3, e1);
        s6 = change(s4, e2);

        int minn = min(e1, e2);//向小的看齐
        s5 = ty(s5, e1, minn);
        s6 = ty(s6, e2, minn);

        long long int n1, n2;
        n1  = change_n(s5);
        n2  = change_n(s6);

        //cout<<n1<<" "<<f1<<" "<<n2<<" "<<f2<<endl;
        long long int sum = n1*(f1)+n2*(f2);
        long long int temp = sum;
        int k=0;
        while(temp)
        {
            temp/=10;
            k++;
        }
        long long int m = 1;
        for(int i=1; i<=(k-1); i++)
            m*=10;
        cout<< sum/m<<"."<< abs(sum % m);
        e1 = e1 + (k-1);
        if(e1!=0)
        {
            cout<<"e"<<e1<<endl;
        }
    }
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值