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 }
时间: 2024-10-03 21:27:48

Codeforces 691C. Exponential notation的相关文章

【模拟】Codeforces 691C Exponential notation

题目链接: http://codeforces.com/problemset/problem/691/C 题目大意: 输入一个数,把它表示成a·10b形式(aEb).输出aEb,1<=a<10,b如果为1要省略Eb 题目思路: [模拟] 如果字符串没有‘.'我就在最后加上一个'.'方便处理. 先把头尾多余的0去掉,然后把这个数按照'.'拆成两半,统计整数部分的位数zs. 接着统计'.'后面的0的个数xs,再把所有数字放到一个数组里,再把头多余的0去掉(0.0000xx). 之后按照zs和sx的

[CodeForces691C]Exponential notation

Translate 给定一个长度为\(N\)的数字,转化为 标准的科学计数法形式.\(N\)最大可达\(10^6\).要考虑前置\(0\) 和 后置 \(0\) 的特殊情况. 当指数为\(0\)的时候,不输出指数部分. 思路: 这个题典型的模拟题,注重思想,各种情况要考虑: 1.为0的情况 \(0\) \(00\) \(0.0\) 2.没有小数点的情况 \(16\) \(100\) \(001\) \(1\) 3.带小数点的情况 \(100.\) \(100.00\) \(01.00\) \(1

delphi Json操作

Creating a Simple JSON Object The following code segment demonstrates the creation of a simple JSON object containing one JSON pair. Once this object is created, its ToString method is invoked, assigning the returned string representation of the JSON

Standard Numeric Format Strings

The following table describes the standard numeric format specifiers and displays sample output produced by each format specifier. See the Notes section for additional information about using standard numeric format strings, and the Example section f

python学习day2(一)

一.上周作业回顾 1.登陆接口: 思路流程: 1.登陆,三次锁定用户 2.用户信息文件,黑名单文件 3.检测黑名单,如输入账号在黑名单中存在,不允许登陆 4.用户密码判断 主要知识点:while,for循环,if判断,文件操作 2.三级菜单: 1.写字典,大字典里套小字典,再在小字典里套列表 2.程序开始,列出大字典力所有的keys. 3.用户选择后,列出小字典的key. 4.用户再次选择后,列出小字典中的列表. 5.在用户选择的时候,可以加入判断,如是否输入正确 6.在用户选择的时候,加入b返

python基础-内置数据类型

一.简介 如果你用过C或者C++,你该知道你的许多工作集中在实现数据结构上面.你需要管理内存分配,部署内存结构等等.这些东西比较乏味,通常会让你无法集中在真正想实现的目标上面. 而在Python中,许多这种乏味的工作都去去除了.Python提供了强大的对象类型作为Python语言的一部分,解决问题时,你不需要手工写代码来实现这些结构了.而且你也不需要亲自实现自己的数据类型.因为内置对象类型有很多好处.如果你是一个编程大牛,哪另当别论,对于初学者,我们首先需要知道如何使用. Python内置数据类

redis命令详解与使用场景举例——String

APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾. 如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样. 可用版本: 2.0.0+ 时间复杂度: 平摊O(1) 返回值: 追加 value 之后, key 中字符串的长度. 对不存在的 key 执行 APPEND redis> EXISTS myphone # 确保 myphone 不

[Linux-shell] AWK

Go to the first, previous, next, last section, table of contents. Printing Output One of the most common actions is to print, or output, some or all of the input. You use the print statement for simple output. You use the printf statement for fancier

Triangle 1.6 (A Two-Dimensional Quality Mesh Generator and Delaunay Triangulator)

Triangle A Two-Dimensional Quality Mesh Generator and Delaunay Triangulator. Version 1.6 Copyright 1993, 1995, 1997, 1998, 2002, 2005 Jonathan Richard Shewchuk 2360 Woolsey #H / Berkeley, California 94705-1927 Bugs/comments to [email protected] Creat