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