Barnicle
时间: 1ms 内存:128M
描述:
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
提示:
参考答案(内存最优[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;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。