这道题看见就觉得是道水题,想着随便写写就能A了,然后就开始上手直接模拟,然后就被数据打脸了。

后面就困了一个多小时,各种改,最后还是看了题解发现了scanf的多种用法。

题目大概意思就是说:

        给一个  a.bec格式的数,让你转化。

a是正整数,b是小数,ec是10的c次方。

就是转化  a.b*10的c次方

下面给代码。

#include<iostream>
#include<cstdio>
using namespace std;

int main() 
{
    char str[2500];
    int a, b, c;
    scanf("%d.", &a);
    scanf("%[^e]%ne%d", str, &b, &c);
    if (str[0] == 48 && c == 0 && b == 1)
    {
        cout << a << endl;
    }
    else if (c >= b)
    {
        printf("%d%s%.*d\n", a, str, c - b, 0);
    }
    else
    {
        printf("%d%.*s.%s\n", a,c,str, str + c);
    }
    return 0;
}

建议结合下下面的的看,不然几个冷门的输入输出符号是看不懂的。

https://blog.csdn.net/shyazhut/article/details/52132917

分析思路:

  首先读入正整数  也就是a,注意scanf("%d.",&a)    %d下边跟着个小数点,这样输入时就把小数点忽略掉了,并且停止读入,进入到下一个scanf

  然后就开始读入字符串,直到e为止,并且不读入e。

  %n就是获取这时候的字符串的长度

  然后%n后面还跟着个e,这个和小数点的作用时一样的,也是忽略掉输入的e,并且停止读入

  最后还接着读入一个整数,也就是e后面的数字

  就这样读入结束啦

下面是输出:

  首先,如果 字符串的首位为字符‘0’(ASCII码为整数 48),并且字符串长度只有1,并且e后面的整数为0,那么就直接输出a。

  如果   e后面的整数大于等于字符串长度(就是小数部分的长度),那么就先输出a,然后输出字符串,最后如果c-b>0,那么就用0补齐。

  如果  e后面的整数小于字符串长度(也就是小数部分的长度),那么就先输出a,然后输出长度为c的字符串,然后输出小数点,最后输出起点为(b+c)的剩余的字符串。

 

ok,就是这样了,学到了几个scanf的用法,美滋滋。