洛谷B2033 A*B 问题题解

题目链接

A*B 问题

题目描述

输入两个正整数 AA 和 BB,求 A \times BA×B 的值。注意乘积的范围和数据类型的选择。

输入格式

一行,包含两个正整数 AA 和 BB,中间用单个空格隔开。1 \le A,B \le 500001≤A,B≤50000。

输出格式

一个整数,即 A \times BA×B 的值。

样例 #1

样例输入 #1

3 4

样例输出 #1

12

样例 #2

样例输入 #2

36 18

样例输出 #2

648

题目大意

计算 A\times BA×B ,满足 1\le A,B\le 5\times 10^41≤A,B≤5×104 。

题解

提供一下相关类型的大小范围。

那么如果选的类型小了会发生什么?

我们知道,在电脑中使用补码的形式存储所有数字。假如我们用的是 \verb!unsigned short!unsigned short 类型,那么当我们计算 1234\times 43211234×4321 时,本质上是 100,1101,0010_{(2)}\times 1,0000,1110,0001_{(2)}100,1101,0010(2)​×1,0000,1110,0001(2)​ ,得出来的结果应该是:

1010001,\underbrace{0101,1100,1001,0010}_{16 \text{位}}1010001,16位0101,1100,1001,0010​​

事实上, \verb!unsigned short!unsigned short 只会保留最后 1616 位,前面溢出的部分就去除了。把 0101,1100,1001,00100101,1100,1001,0010 转换成 1010 进制,就是 2369823698 。你可以拿 C++ 试一试,可以发现强制转换成 \verb!unsigned short!unsigned short 后的确是这个值。

要注意的是,对于有符号整数,乘法溢出属于未定义行为,具体数值与编译器有关。

至于这题,由于 A,B\le 5\times 10^4A,B≤5×104 ,而 A\times B\le 2.5\times 10^9A×B≤2.5×109 ,可能会突破 \text{int}int 的上限(2,147,483,6472,147,483,647)因此选择 \verb!long long!long long 类型才行。

参考代码

#include<bits/stdc++.h>
#define up(l,r,i) for(int i=l,END##i=r;i<=END##i;++i)
#define dn(r,l,i) for(int i=r,END##i=l;i>=END##i;--i)
using namespace std;
typedef long long i64;
const int INF =2147483647;
char s[256]; i64 a,b;
int main(){
    cin>>a>>b; cout<<a*b;
    return 0;
}

或者(小白方法)

#include <bits/stdc++.h>

using namespace std;

int main(){
	long long a, b;//定义。
	cin >> a >> b;//输入。
	cout << a * b;//输出a乘b。
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值