CodeForces - 697B
这道题看见就觉得是道水题,想着随便写写就能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的用法,美滋滋。