Educational Codeforces Round 14
2016-07-15 11:30
281 查看
C. Exponential notation
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given a positive decimal number x.
Your task is to convert it to the "simple exponential notation".
Let x = a·10b, where 1 ≤ a < 10,
then in general case the "simple exponential notation" looks like "aEb". If b equals
to zero, the part "Eb" should be skipped. If a is an integer, it
should be written without decimal point. Also there should not be extra zeroes in aand b.
Input
The only line contains the positive decimal number x. The length of the line will not exceed 106.
Note that you are given too large number, so you can't use standard built-in data types "float", "double"
and other.
Output
Print the only line — the "simple exponential notation" of the given number x.
Examples
input
output
input
output
input
output
input
output
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#define inf 1<<30
#define maxn 10005
#define LOOP(a,b,c) for(int a=b;a<=c;a++)
using namespace std;
string ch;
void clear_first_zero()
{
string::iterator it = ch.begin();
if (*it == '.'){
ch.insert(it, '0');
return;
}
int t=0;
for (int i = 0; i < ch.size(); i++)
{
if (ch[i] == '0'&&ch[i+1]!='.')
t++;
else
break;
}
ch = ch.erase(0, t);
if (!ch.size())
ch = "0";
}
void clear_last_zero()
{
int pos = ch.find('.', 0);
if (pos == -1)
{
//ch += '.';
return;
}
int t = ch.size();
for (int i = ch.size() - 1; i >= 0; i--)
{
if (ch[i] == '0') t--;
else if (ch[i] == '.') { t--; break; }
else break;
}
ch = ch.erase(t, ch.size());
}
int move()
{
int pos = ch.find('.', 0), change = 0;
if (ch.size() == 1) return 0;
if (pos == -1 ) {
ch += '.';
pos = ch.find('.', 0);
}
if (pos >= 2)
{
for (int i = pos; i >= 2; i--)
{
swap(ch[i], ch[i - 1]);
//Right = sum(Right, add);
change++;
}
//clear_first_zero();
clear_last_zero();
}
else
{
string::iterator it = ch.begin();
if (*it != '0'&&*(it+1)=='.'&&(it+2)!=ch.end()||ch=="0") return 0;
for (int i = 0; i < ch.size(); i++)
{
if (ch[i] != '0'&& ch[i] != '.')
break;
if (ch[i] != '.') change--;
}
ch=ch.erase(0, -change+1);
if(ch.size()>1)
ch.insert(ch.begin() + 1, '.');
}
return change;
}
int main()
{
//freopen("Text.txt", "r", stdin);
cin >> ch;
clear_first_zero();
clear_last_zero();
int t = move();
if (t > 0)
cout << ch << "E" << t << endl;
else if (t < 0)
else
cout << ch << endl;
}
大神的代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#define inf 1<<30
#define maxn 1000005
#define LOOP(a,b,c) for(int a=b;a<=c;a++)
using namespace std;
int main()
{
string s;
cin >> s;
int pos = s.find('.');
if (pos != -1) {
s.erase(pos, 1);
} else {
pos = s.size();
}
int pos2 = 0;
for (int i=0; i<s.size(); i++) {
if (s[i] > '0') {
pos2 = i;
break;
}
}
int e = pos - pos2 - 1;
s.erase(0, pos2);
while (s.size() > 1 && s.back() == '0') {
s.pop_back();
}
if (s.size() >= 2) {
s.insert(1, ".");
}
if (e == 0) {
cout << s << endl;
} else {
cout << s << "E" << e << endl;
}
}
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given a positive decimal number x.
Your task is to convert it to the "simple exponential notation".
Let x = a·10b, where 1 ≤ a < 10,
then in general case the "simple exponential notation" looks like "aEb". If b equals
to zero, the part "Eb" should be skipped. If a is an integer, it
should be written without decimal point. Also there should not be extra zeroes in aand b.
Input
The only line contains the positive decimal number x. The length of the line will not exceed 106.
Note that you are given too large number, so you can't use standard built-in data types "float", "double"
and other.
Output
Print the only line — the "simple exponential notation" of the given number x.
Examples
input
16
output
1.6E1
input
01.23400
output
1.234
input
.100
output
1E-1
input
100.
output
1E2
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#define inf 1<<30
#define maxn 10005
#define LOOP(a,b,c) for(int a=b;a<=c;a++)
using namespace std;
string ch;
void clear_first_zero()
{
string::iterator it = ch.begin();
if (*it == '.'){
ch.insert(it, '0');
return;
}
int t=0;
for (int i = 0; i < ch.size(); i++)
{
if (ch[i] == '0'&&ch[i+1]!='.')
t++;
else
break;
}
ch = ch.erase(0, t);
if (!ch.size())
ch = "0";
}
void clear_last_zero()
{
int pos = ch.find('.', 0);
if (pos == -1)
{
//ch += '.';
return;
}
int t = ch.size();
for (int i = ch.size() - 1; i >= 0; i--)
{
if (ch[i] == '0') t--;
else if (ch[i] == '.') { t--; break; }
else break;
}
ch = ch.erase(t, ch.size());
}
int move()
{
int pos = ch.find('.', 0), change = 0;
if (ch.size() == 1) return 0;
if (pos == -1 ) {
ch += '.';
pos = ch.find('.', 0);
}
if (pos >= 2)
{
for (int i = pos; i >= 2; i--)
{
swap(ch[i], ch[i - 1]);
//Right = sum(Right, add);
change++;
}
//clear_first_zero();
clear_last_zero();
}
else
{
string::iterator it = ch.begin();
if (*it != '0'&&*(it+1)=='.'&&(it+2)!=ch.end()||ch=="0") return 0;
for (int i = 0; i < ch.size(); i++)
{
if (ch[i] != '0'&& ch[i] != '.')
break;
if (ch[i] != '.') change--;
}
ch=ch.erase(0, -change+1);
if(ch.size()>1)
ch.insert(ch.begin() + 1, '.');
}
return change;
}
int main()
{
//freopen("Text.txt", "r", stdin);
cin >> ch;
clear_first_zero();
clear_last_zero();
int t = move();
if (t > 0)
cout << ch << "E" << t << endl;
else if (t < 0)
else
cout << ch << endl;
}
大神的代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#define inf 1<<30
#define maxn 1000005
#define LOOP(a,b,c) for(int a=b;a<=c;a++)
using namespace std;
int main()
{
string s;
cin >> s;
int pos = s.find('.');
if (pos != -1) {
s.erase(pos, 1);
} else {
pos = s.size();
}
int pos2 = 0;
for (int i=0; i<s.size(); i++) {
if (s[i] > '0') {
pos2 = i;
break;
}
}
int e = pos - pos2 - 1;
s.erase(0, pos2);
while (s.size() > 1 && s.back() == '0') {
s.pop_back();
}
if (s.size() >= 2) {
s.insert(1, ".");
}
if (e == 0) {
cout << s << endl;
} else {
cout << s << "E" << e << endl;
}
}
相关文章推荐
- HEVC标准概览(五)Profile、Tier和Level
- Android学QQ聊天列表展示ListView
- 图片下拉放大 导航栏下拉隐藏 上拉出现
- Git版本控制
- Android 开发你需要了解的 Gradle 配置
- MAC下的文本编辑器 Vim
- JAVA文件操作大全(5)
- hihocoder #1061 : Beautiful String
- 如何写一篇好的技术博客
- redis配置文件
- 微信公众号开发教程[011]-自定义菜单以及个性化菜单
- HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth之完全详解
- iOS开发:UITableview的多选功能实现
- 归并排序
- 设计模式之单例模式
- Java文件操作大全(4)
- [转]ListView学习笔记(一)——缓存机制
- 测试GeoGebra博客
- RequireJS基础(三)
- Ajax+Struts2实现验证码验证功能实例代码