• 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;
    }
  • 相关阅读:
    在maven工程中使用groovy
    groovy学习1搭建环境
    Android 中运行时权限获取联系人信息 Demo
    Android 拍照或相册选择照片进行显示缩放位图 Demo
    Android 热点相关操作
    Android 内嵌 HTML5 并进行交互
    AJAX实现局部刷新
    C#主要用于查询sql的web项目:查询以及页面显示数据非常缓慢的改进方案
    配置和读取web.config数据库
    web项目在服务器IIS7上的部署:达到内部网可以通过输入网页直接访问的效果
  • 原文地址:https://www.cnblogs.com/wshyj/p/6293207.html
Copyright © 2020-2023  润新知