Codeforces 691C. Exponential notation

题目链接:http://codeforces.com/problemset/problem/691/C

题意:
  给你一个浮点数,让你把这个数转化为 aEb 的形式,含义为 a * 10b, 其中 a 只能为一个不小于 1.0 且不大于等于10.0的小数, b 为一个不为0 的整数.具体样例参考原题的输入输出.

思路:

  直接模拟就好,感觉写的好复杂,分了许多情况,需要注意许多特殊情况,注意不输出小数点 (".")的情况还有多余的 “0” 的情况 .

代码:

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int MAXN = 1000000;
 6 typedef long long LL;
 7 
 8 void Formatst(int &st, char str[]) { while(str[st] == '0' ) st++; } //格式化前导 “0”
 9 void Formated(int &ed, char str[]) { while(str[ed] == '0' ) ed--; } // 格式化小数后面的 “0”
10 
11 int main() {
12     ios_base::sync_with_stdio(0); cin.tie(0);
13     char str[MAXN + 3] = {0}; cin >> str;
14     int len = strlen(str);
15     int st = 0, ed = len - 1;
16     int scale = -1;
17     for(int i = st; i <= ed; i++) {
18         if(str[i] == '.') {
19             scale = i;
20             break;
21         }
22     }
23     if(scale == -1 || scale == len - 1 || scale == 0) { // 处理没有小数点或者 小数点在最后一位 或者小数点在第一位
24         if(scale == len - 1) ed--;
25         if(scale == 0) st++;
26         Formatst(st, str);
27         char zh = str[st];
28         if(zh == '\0' || zh == '.') {
29             cout << "0" << endl;
30             return 0;
31         }
32         int sc = st + 1;
33         int EE = ed - st; // 结果为 10EE  
34         Formated(ed, str);
35         if(scale == 0) EE = -st;
36         cout << zh;
37         if(st != ed) {
38             cout << ".";
39             for(int i = sc; i <= ed; i++) cout << str[i];
40         }
41         if(EE != 0) cout << "E" << EE;
42         cout << endl;
43     }
44     else {
45         Formatst(st, str);
46         Formated(ed, str);
47         if(str[st] == '.' && str[ed] == '.') { // 处理小数点两端都是 0 的情况
48             cout << "0" << endl;
49             return 0;
50         }
51         else if (str[st] == '.' && str[ed] != '.') { // 处理小数点前面全部都是 0, 后面存在数字的情况
52             int EE = 0;
53             int i;
54             for(i = st + 1; i <= ed; i++) {
55                 EE--;
56                 if(str[i] == '0') continue;
57                 else break;
58             }
59             char zh = str[i];//整数部分第一个数
60             if(i == ed) {
61                 cout << zh << 'E' << EE << endl;
62             }
63             else {
64                 cout << zh << '.';
65                 for(int j = i + 1; j <= ed; j++) cout << str[ed];
66                 cout << 'E' << EE;
67             }
68         }
69         else if(str[st] != '.' && str[ed] == '.'){ // 处理小数点前面有数字, 后面都是 0 的情况
70             --ed;
71             if(ed == st) {
72                 cout << str[st] << endl;
73                 return 0;
74             }
75             char zh = str[st];
76             int EE = ed - st;
77             while(str[ed] == '0') ed--;
78             cout << zh;
79             for(int i = st + 1; i <= ed; i++) cout << (i == st + 1 ? ".":"")<< str[i];
80             cout << 'E' << EE << endl;
81         }
82         else { // 处理小数点前面和后面都有数字的情况
83             char zh = str[st];
84             int EE = scale - st - 1;
85             cout << zh << '.';
86             for(int i = st + 1; i <= ed; i++) if(str[i] != '.') cout << str[i];
87             if(EE != 0)cout << 'E' << EE;
88             cout << endl;
89         }
90     }
91     return 0;
92 }

 

转载于:https://www.cnblogs.com/Ash-ly/p/5837458.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值