PAT1024

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][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

技巧:分段输出  比如1.23400 * 10^-3  等于0.00123400 

                    把0.看出一段  这是无论如何都存在的 所以可以先输出0.

                    中间的00看成一段 这一段的0个数与指数有关 指数为-1  输出0个0  指数为-2 输出1个0  以此类推 循环输出

                    最后的主体部分123400 就是原式中的1.23400去掉小数点  处理一下输出

   三次输出,构成答案,如果全部挤在一起输出 会显复杂

# include<iostream>
# include<algorithm>
# include<stdio.h>
# include<string>
using namespace std;
int main()
{
    char s[35000],fuhao1,fuhao2,zs[5];
    int i,zhi=0,j,h=0,k=0,flag=0,tn = 1;
    int zhishu;
    string a;
    cin>>a;
    fuhao1 = a[0];
    if(fuhao1=='+')   //分段输出----------符号
    {
        
    }
    else
    {
           cout<<"-";
    }
    for(i=1;i<a.length();i++)    //利用flag 将字符串a分成  主体数字字符串 、指数符号、 指数字符串 三个部分
    {
            if(a[i]=='E')
            {
                   flag = 1; continue;
        }
            
            if(flag==0)
            {
                    s[11000+h] = a[i]; h++;
        }
        else if(flag == 1)
        {
               fuhao2 = a[i]; flag = 2; continue;   
        }
        else
        {
                zs[k]=a[i]; k++;
        }
    }
    
    for(i=k-1;i>=0;i--)     //将指数字符串 转化为 整数形式
    {
            zhi = zhi + (zs[i]-'0')*tn;
            tn = tn * 10;
    }
    
    if(fuhao2=='+')            //如果指数前的符号为正  分为3种可能 小数点仍存在 小数点刚好消失 小数点消失且要加0
    {
            if(h>zhi+2)
            {
                    char t;
                    t = s[11001];    //保存小数点
                    for(i=0;i<zhi;i++) //数组循环前移,覆盖住了小数点的位置
                    {
                        s[11001+i] = s[11002+i];    
             }
             s[11001+zhi] = t;  //将小数点 放在数组前移后留下的最后一个位置
             for(i=0;i<h;i++)
             {
                   cout<<s[11000+i];
            }
        }
        else if(h==zhi+2)
        {
              for(i=0;i<h;i++)
              {
                  if(i==1)
             {
                    continue;                
             }     
             cout<<s[11000+i];
          }
        }
        else
        {
                for(i=0;i<h-2;i++) //数组循环前移覆盖小数点
                {
                    s[11001+i] = s[11002+i];       
            }
                 zhishu = zhi -h + 2;
                for(j=0;j<zhishu;j++)
                {
                     s[11002+i-1+j] = '0';    //加0
            }
            for(i=0;i<=zhi;i++)
            {
                  cout<<s[11000+i];
            }
        }
    }
    else
    {
           
               char t;
            t = s[11000];s[11000]=s[11001];s[11001]=t;
            cout<<"0.";
            for(i=1;i<zhi;i++)
            {
                   cout<<"0";
            }
            for(i=1;i<h;i++)
            {
                  cout<<s[11000+i];
            }

    }
    return 0;
}
原文地址:https://www.cnblogs.com/wshyj/p/6293207.html