AtCoder题解——Beginner Contest 169——C - Multiplication 3

题目相关

题目链接

AtCoder Beginner Contest 169 C题,https://atcoder.jp/contests/abc169/tasks/abc169_c。

Problem Statement

Compute A×B, truncate its fractional part, and print the result as an integer.

Input

Input is given from Standard Input in the following format:

A B

Output

Print the answer as an integer.

Samples1

Sample Input 1

198 1.10

Sample Output 1

217

Explaination

We have 198×1.10=217.8. After truncating the fractional part, we have the answer: 217.

Samples2

Sample Input 2

1 0.01

Sample Output 2

0

Samples3

Sample Input 3

1000000000000000 9.99

Sample Output 3

9990000000000000

Constraints

  • 0 ≤ A ≤ 10^15
  • 0 ≤ B < 10
  • A is an integer.
  • B is a number with two digits after the decimal point.

题解报告

惭愧,本题在比赛的时候竟然两次出现 WA。哎,真的是菜死了。

之所以记录本题,不是本题有多少难,其实本题是一个水题。本题考查的知识点竟然又是浮点数的精度问题。这个问题和测试服务器有关,毕竟我们是在 AtCoder 的服务器上比赛。我真服了,这个知识点好像国内的 OJ 中比较难得考到,也可能是我进到的题目不够多。

WA 过程

第一次 WA 代码

#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;
}

第二次 WA 代码

#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;
}

AC 参考代码

连续两次 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 将测试用例放出,我再进一步研究一下数据。再次触及知识的盲点。

你可能感兴趣的:(OJ题解,#,AtCoder题解)