1 条题解

  • 0
    @ 2025-8-24 21:24:41

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Oracynx
    CodingOIer -> Oracynx || OI 代码位于 https://github.com/Oracynx/Source-Code || https://codingoier.com

    搬运于2025-08-24 21:24:40,当前版本为作者最后更新于2023-12-11 22:30:11,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    P1401 [入门赛 #18] 禁止在 int 乘 int 时不开 long long 题解

    思路分析

    题目说的不是我吗?

    题目要求在 intint 溢出时输出 long long int\texttt{long long int},否则输出 int\texttt{int},这里有个小技巧,我们可以利用 C++ 的数据自然溢出解题。

    首先我们记 int ix, iy, ia, ib; 为对应数据在 int 类型下的储存,long long x, y, a, b; 为在 long long 类型下的储存。比较连个相乘的结果即可。

    一种常见的错误:

    #include <cstdio>
    int ix, iy;
    int ia, ib;
    long long x, y;
    long long a, b;
    int main()
    {
        scanf("%lld%lld", &x, &y);
        scanf("%lld%lld", &a, &b);
        ix = x;
        iy = y;
        ia = a;
        ib = b;
        if (x * a != ix * ia || y * b != iy * ib)
        {
            printf("long long int\n");
        }
        else
        {
            printf("int\n");
        }
        return 0;
    }
    

    显而易见的 Hack 数据:

    -1000000 1
    -1 1000000
    

    因为我们只相乘了左右端点,但如果其交叉相乘溢出则无法判断。

    所以我们需要判断 44 种情况。

    代码实现

    #include <cstdio>
    int ix, iy;
    int ia, ib;
    long long x, y;
    long long a, b;
    int main()
    {
        scanf("%lld%lld", &x, &y);
        scanf("%lld%lld", &a, &b);
        ix = x;
        iy = y;
        ia = a;
        ib = b;
        if (x * a != ix * ia || x * b != ix * ib || y * a != iy * ia || y * b != iy * ib)
        {
            printf("long long int\n");
        }
        else
        {
            printf("int\n");
        }
        return 0;
    }
    
    • 1

    [入门赛 #18] 禁止在 int 乘 int 时不开 long long

    信息

    ID
    9504
    时间
    100ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    1
    已通过
    0
    上传者