科学计数法的值

科学计数法是一种数学专用术语。将一个数表示成 a×10的n次幂的形式,其中1≤|a|<10,n为整数,这种记数方法叫科学计数法。例如920000可以表示为9.2*10^5

现在需要对输入的字符串进行分离,自动识别该科学计数法中的a和幂次,计算其表征的具体数值并输出该值。

例如,对于输入的复数字符串“9.210^5”,输出 The actual value for 9.210^5 is 920000

注意:

1、每组测试数据仅包括一个用于科学计数法的字符串。

2、输入字符串保证合法。

3、字符串长度不超过1000

4、幂次不超过200

输入示例:

9.2*10^5

输出示例:

The actual value for 9.2*10^5 is 920000

--------------------------------------------------------------

             参考代码

--------------------------------------------------------------

欢迎指教!

#include<stdio.h>
#include<iostream>
#include<string>
#include<sstream>
//<sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。
using namespace std;
int main()
{
    string str;
    while(cin>>str)
    {
        string ans;//记录底数部分 
        bool flag,isSign,isMinus;
        int i;
        
        int len=str.size();//返回字符串长度 
        string::size_type loc=str.find("^");//查找^ 
        //找不到abc会返回-1,不为0为True。0为False 
        //任何存储string的size操作结果的变量必须为string::size_type类型。
        
        //检查指数部分是否为正 
        if(str[loc+1]!='-') 
            isSign=false;
        else 
            isSign=true;
            
        if(!isSign)//指数部分为正 
        {
            int intcnt=0;//记录底数整数部分长度 
            for(i=0;str[i]!='*' && str[i]!='.';i++)
            {
                ans+=str[i];
                intcnt++;
            }
            
            if(str[i]=='.')     i++;//跳过小数点 
                
            int cnt=0;//记录底数小数部分长度 
            for(;str[i]!='*';i++)
            {
                ans+=str[i];
                cnt++;
            }

            int record;//记录指数数值 
            string tmp;//中间 
            stringstream ss;//
            
            if(loc==string::npos) 
                record = 1;
            else
            {
                for(i=loc+1;i<len;i++)//记录指数部分 
                    tmp+=str[i];

                ss<<tmp;//String
                ss>>record;//int
            }
            //判断是否不存在小数点 
            if(record<cnt)    
                flag = false;
            else    
                flag=true;
            
            int len1=ans.size();//底数部分长度 
            if(flag)//纯整数 
            {
                cout<<"The actual value for "<<str<<" is "<<ans;
                for (i=record-cnt;i>0;i--)    
                    cout<<"0";                    
                cout<<endl;
            }
            else//有小数点 
            {
                cout<<"The actual value for "<<str<< " is ";
                for (i=0;i<intcnt+record;i++)    
                    cout<<ans[i];    
                cout << ".";
                for (i=intcnt+record;i<len1;i++)    
                    cout<<ans[i];
                cout<<endl;
            }
        }
        else//指数部分为负
        {
            if(str[0]=='-')
            {
                str.erase(0,1);
                isMinus = true;
            }
            else
            {
                isMinus = false;
            }
            
            len=str.size();
            int intcnt=0;
            for(i=0;str[i]!='*' && str[i]!='.'; i++)
            {
                ans += str[i];
                intcnt++;
            }
            if(str[i]=='.')
                i++;
            for(;str[i]!='*';i++)
                ans += str[i];
            
            int record;
            string tmp;
            stringstream ss;
            if(loc==string::npos)
                record=1;
            else
            {
                if(isMinus)
                    for(i=loc+1;i<len;i++)    
                        tmp+=str[i];
                else
                    for(i=loc+2;i<len;i++)    tmp+=str[i];
                ss<<tmp;
                ss>>record;
            }
            cout<<"The actual value for "<<str<<" is ";
            if(isMinus)
                cout<<"-";
            cout<<"0.";
            
            for(i=0;i<record-intcnt;i++)    
                cout<<"0";
            cout<<ans<<endl;
        }
    }
    return 0;
}

欢迎指教,一起学习!

未经本人允许,请勿转载!

谢谢!

个人分享,欢迎指导,未经允许,请勿转载。谢谢!
原文地址:https://www.cnblogs.com/hello-OK/p/6930823.html