• CodeForces


    这道题看见就觉得是道水题,想着随便写写就能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
    ", a, str, c - b, 0);
        }
        else
        {
            printf("%d%.*s.%s
    ", 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的用法,美滋滋。

  • 相关阅读:
    josn类库引用
    WPF圆角按钮
    C#实现某一属性值变化时触发事件 Form1_changeEvent是对应的事件
    C#winform生成安装包
    特性
    反射可以动态调用对象(一般是类)的名称,属性,方法等。具体见下。重要
    原子操作 和Inerlocked 常用于多线程同步
    spingboot 配置多个数据源报错
    Address already in use: JVM_Bind 端口被占用的几个解决办法
    数据库问题(一)
  • 原文地址:https://www.cnblogs.com/caibingxu/p/10111260.html
Copyright © 2020-2023  润新知