1 条题解
-
0
自动搬运
来自洛谷,原作者为

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 题解
思路分析
题目说的不是我吗?题目要求在
int乘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因为我们只相乘了左右端点,但如果其交叉相乘溢出则无法判断。
所以我们需要判断 种情况。
代码实现
#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
信息
- ID
- 9504
- 时间
- 100ms
- 内存
- 512MiB
- 难度
- 1
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者