1036:A×B问题
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
输入两个正整数A和B,求A×B的值。注意乘积的范围和数据类型的选择。
【输入】
一行,包含两个正整数A和B,中间用单个空格隔开。1≤A,B≤50000。
【输出】
一个整数,即 A×B 的值。
【输入样例】
3 4
【输出样例】
12
说明:
主要考查对整型取值范围的理解。
思路分析:
如果直接变量使用int类型,提交后有个别测试点没通过,原因是变量取值问题。
题目已指明A和B的取值最小是1,最大是50000。先看最小值,如果A和B都为1,那么A×B的结果为1,不会溢出。而如果A和B都为50000,那么A×B的结果为2500000000。
int类型一般的取值范围:
-2147483648 ~ 2147483647
2500000000
2147483647
经过对比,很明显已超出int类型的取值范围。所以变量的类型应取unsigned类型或long long类型。一般long类型的取值范围与int类型的取值范围一样,所以不要选择long类型。
延伸学习:
溢出:在这里可以简单地理解为,是指超出指定类型的取值范围。例如超出int类型的最小值或最大值,即在int类型取值范围之外。
unsigned:unsigned是unsigned int的简写,是无符号int类型,而一般的int类型是有符号的。unsigned的取值范围:0 ~ 4294967295。
long long:long long是long long int的简写,是有符号的类型。取值范围:-9223372036854775808 ~ 9223372036854775807。
求解过程:
声明2个unsigned类型变量A和。
输入2个整数给变量A和B。
输出变量A的值。
参考代码 - C++:
#include <iostream>
using namespace std;
int main()
{
unsigned A, B;
cin >> A >> B;
cout << A * B;
return 0;
}
参考代码 - C语言:
输入和输出unsigned类型变量时,应使用"%u"。
#include <stdio.h>
int main()
{
unsigned A, B;
scanf("%u %u", &A, &B);
printf("%u", A * B);
return 0;
}