YTU_3313: Barnicle(模拟)

3313: Barnicle

时间限制: 1 Sec  内存限制: 128 MB
提交: 28  解决: 4
[提交][状态][讨论版][命题人:acm4302]

题目描述

Barney站在酒吧里,主演一个漂亮的女孩。他想用丘比特之箭射击她,但他需要知道他和女孩之间的距离才能使他的射击准确。 

Barney向酒吧招标Carl询问了这个距离值,但是Carl很忙于与客户交谈,所以他在餐巾纸上写下了距离值(这是一个实数)。问题是他用科学计数法写了它。某些实数x的科学符号是形式AeB的符号,其中A是实数,B是整数,x = A * 10^B。在我们的例子中,A在0到9之间,B是非负的。 

Barney对科学计数法一无所知。因此他要求你告诉他通常的十进制表示中的距离值。请参阅输出格式以便更好地理解。

输入

一行字符串“a.deb“,a,d,b是三个整数,e是科学计数法的符号(0<=a<=9,0<=d<=10^100,0<=b<=100)

a,b不包含前导0,d不包含尾随0。

如果a为0,则b不能为非0。

输出

以十进制表示法在唯一的行中打印唯一的实数x(所需的距离值),整数不包含前导0,小数不包含尾随0。

如果x是一个整数,则打印它的整数值,不带小数部分和小数点,也不带前导零。

样例输入

8.549e2

样例输出

854.9

提示

1.0e2

100

 

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=j;i<k;i++)
int main(void)
{
    int a;
    cin>>a;
    char pot;cin>>pot;
    string d; cin>>d;
    int ra=1;
    int b=0;
    int len = d.length();
    int st=d.length();
    for(int i=d.length()-1;i>=0;i--)
    {

        if(d[i]=='e')
        {
            st=i;
            break;
        }
        int t= (d[i]-'0')*ra;
        b += t;      //10^倍率
        ra*=10;
    }

    if(a!=0)
    {
        cout<<a;       //不为0直接输出
        if(st>=b)      //小数串的长度足够先直接输出长度为b的串
        {
            rep(i,0,b) cout<<d[i];

            int flag=0;             //检查加倍后的小数部分是否存在不为0的数
            rep(i,b,st) if(d[i]!='0') {flag=1;break;}
            if(flag)         //存在则需要小数点+d串后面部分,不存在不做任何动作
            {
                cout<<pot;
                rep(i,b,st) cout<<d[i];
            }
            cout<<endl;
        }
        else             //小数串的长度不足,由于a!=0先直接输出d串,不够的部分0填充
        {
            rep(i,0,st) cout<<d[i];
            rep(i,st,b) cout<<"0";
            cout<<endl;
        }

    }

    else     //a==0的情况
    {

        int nb=b;    //忽略d串前导0
        rep(i,0,b)  if(d[i]!='0'){nb=i;cout<<d[i];break;}
        if(nb==b)   cout<<"0";//全0情况只输出一个0
        if(st>=b)
        {
            rep(i,nb+1,b)  cout<<d[i];  //从新的非0位置开始输出满b个数!  
            int flag=0;
            rep(i,b,st) if(d[i]!='0') {flag=1;break;}   //同上
            if(flag)
            {
                cout<<pot;
                rep(i,b,st) cout<<d[i];
            }
            cout<<endl;
        }
        else       //当d串长度不能满足b个数的输出,1、要么输出0  2、要么输出无前导0的d串,不足的用0填充
        {
            int flag=0;
            rep(i,0,st)
                if(d[i]!='0')
                {
                    cout<<d[i];
                    flag=1;
                }
            if(!flag) cout<<"0";
            else
                rep(i,st,b) cout<<"0";
            cout<<endl;
        }
    }//a==0情况结束 
}

附带java代码:

import java.util.Scanner; 
import java.math.BigDecimal;
public class Main
{
    public static void main(String[] args)
    {
       Scanner cin = new Scanner(System.in);
       String s = cin.next();
       BigDecimal a = new BigDecimal(s); 
       System.out.print(a.stripTrailingZeros().toPlainString()); 
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值