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());
}
}