AtCoder Beginner Contest 169 C题,https://atcoder.jp/contests/abc169/tasks/abc169_c。
Compute A×B, truncate its fractional part, and print the result as an integer.
Input is given from Standard Input in the following format:
A B
Print the answer as an integer.
198 1.10
217
We have 198×1.10=217.8. After truncating the fractional part, we have the answer: 217.
1 0.01
0
1000000000000000 9.99
9990000000000000
惭愧,本题在比赛的时候竟然两次出现 WA。哎,真的是菜死了。
之所以记录本题,不是本题有多少难,其实本题是一个水题。本题考查的知识点竟然又是浮点数的精度问题。这个问题和测试服务器有关,毕竟我们是在 AtCoder 的服务器上比赛。我真服了,这个知识点好像国内的 OJ 中比较难得考到,也可能是我进到的题目不够多。
#include
using namespace std;
int main(){
long long a;
double b;
scanf("%lld%lf", &a, &b);
b = a*b;
printf("%lld\n", (long long)b);
return 0;
}
#include
using namespace std;
int main(){
long long a;
double b;
scanf("%lld%lf", &a, &b);
b = a*(b*100)/100;
printf("%lld\n", (long long)b);
return 0;
}
连续两次 WA 后,我认真的阅读了一下题目,该题目没有什么难度啊。不可能出现 WA。唯一的可能就是传说中的浮点数精度不够导致。我真服气,AtCoder 好像特别喜欢考察这个知识点。
怎么办呢,那就提升精度呗。根据题目的意思,浮点数是一个两位的浮点数,那么我们将这个浮点数扩大一百倍就可以了。直接用 double 读如,扩大 100 倍是不行的。可以考虑用字符串读入。
#include
int main() {
unsigned long long a, b;
char s[6];
scanf("%lld%s", &a, s);
b = (s[0]-'0')*100 + (s[2]-'0')*10 + (s[3]-'0');
printf("%llu\n", a*b/100);
return 0;
}
等 AtCoder 将测试用例放出,我再进一步研究一下数据。再次触及知识的盲点。