Barnicle

Barnicle

时间: 1ms        内存:128M

描述:

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

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

提示:

参考答案(内存最优[1120]):

#include<cstdio>
#include<cstring>
char d[200],s[200];
int main()
{
	int a,p;
	scanf("%d%*c%[^e]%*c%d",&a,d,&p);
	sprintf(s,"%d",a);
	int point=strlen(s);
	if(strcmp(d,"0")) strcat(s,d);
	int tot=strlen(s);
	point+=p;
	for(int i=tot;i<point;i++){
		s[i]='0';
	}
	for(int i=0;s[i];i++){
		if(i==point){
			putchar('.');
		}
		putchar(s[i]);
	}
	return 0;
}

参考答案(时间最优[2]):

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX = 2e5 + 5;

int n, m;
#define sz(s)     (int)s.size()

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    string s;
    string ans;
    int d = 0;
    cin >> s;
    int point = 0;
    int e = 0;
    for (int i = 0; s[i]; ++i)
    {
        if (s[i] == '.') point = i;
        if (!e && s[i] != 'e') ans.push_back(s[i]);
        if (s[i] == 'e')
        {
            e = i;
            continue;
        }
        if (e) d = d * 10 + (s[i] - '0');
    }
    for (int i = 0; i<d; ++i)
    {
        if (point == sz(ans) - 1)
        {
            ans += "0";
            swap(ans[point], ans[sz(ans) - 1]);
            point++;
        }
        else
        {
            swap(ans[point], ans[point+1]);
            point ++;
        }
    }
    int st = 0;
    while (ans[st] == '0') st++;
    if (ans[st]=='.')
    {
        cout<<"0";
        st ++;
        int ed = sz(ans)-1;
        while (ans[ed] == '0') ed--;
        if (ans[ed] == '.') return 0;
        cout<<".";
        for (int i=st; i<=ed; ++i) cout<<ans[i];
        return 0;
    }
    int i;
    for (i=st; ans[i]!='.'; ++i)
        cout<<ans[i];
    st = i+1;
    if (ans[st] == '\0') return 0;
    int ed = sz(ans)-1;
    while (ans[ed] == '0') ed--;
    if (ans[ed] == '.') return 0;
    cout<<".";
    for (int i=st; i<=ed; ++i) cout<<ans[i];
    return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注