Codeforces 691C. Exponential notation 模拟题

本文介绍了一种将任意正十进制数转换为简单指数记法的方法,即a*10^b的形式(1≤a<10)。通过确定数字的有效起始位置、结束位置及小数点位置来实现输出,确保输出简洁且符合规范。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
16
output
1.6E1
input
01.23400
output
1.234
input
.100
output
1E-1
input
100.
output
1E2

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

题意:就是把一个数转换成a*10^b(1≤a﹤10)形式,输出aEb。
思路:标记第一个不为零的数的位置作为起点s,标记最后一个不为零的数的位置作为终点e,标记小数点的位置sign,默认位置应该为len+1。根据三个位置进行输出。

代码:
#include<bits/stdc++.h>
using namespace std;
char x[1000100];
int main()
{
    int i;
    scanf("%s",x);
    int len=strlen(x);
    int s=-1,e=len-1,sign=len;
    for(i=0; i<len; i++)
        if(x[i]=='.')
        {
            sign=i;
            break;
        }
    for(i=0; i<len; i++)
        if(x[i]>'0'&&x[i]<='9')
        {
            s=i;
            break;
        }
    for(i=len-1; i>=0; i--)
        if(x[i]>'0'&&x[i]<='9')
        {
            e=i;
            break;
        }
    if(s>=0)
    {
        cout<<x[s];
        if(e>s) cout<<".";
        for(i=s+1; i<=e; i++)
            if(x[i]!='.') cout<<x[i];
        if((s+1)!=sign)
        {
            cout<<"E";
            if(s<sign) cout<<sign-s-1<<endl;
            else if(s>sign) cout<<sign-s<<endl;
        }
    }
    else cout<<"0"<<endl;
    return 0;
}
View Code
 
    

 

 
    

 

 

转载于:https://www.cnblogs.com/GeekZRF/p/5687860.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值