输入两个正整数A和B,求A*B。
3 4样例输出
12提示
注意乘积的范围和数据类型的选择
关于这个题目,感觉很简单,A,B 的范围没有超过int型的范围,但乘积超过了,所以想着用longlong型。
于是程序写成了:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a,b;
long long c;
cin>>a>>b;
c=a*b;
cout<<c;
return 0;
}
进行最大数验证:
50000 50000
-1794967296
--------------------------------
Process exited with return value 0
Press any key to continue . . .
竟然超出了范围了,百思不得其解。
后来思考后才知道
原因在c=a*b;这条语句上。a,b都是int型,他的乘积也是int型,只是把它赋值给了一个longlong型的变量c。但再赋值前就已经超出int型的范围,溢出了。解决办法就是,a和b至少有一个longlong型的才可以。
long long a;
int b;
或者直接都改成long long型变量。
这个问题经常容易忽略。
其实还有一个跟这个很类似的问题。
比如:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a,b;
float c;
cin>>a>>b;
c=a/b;
cout<<c;
return 0;
}
如果a=5,b=2,c的值应该是什么呢?
5 2
2
--------------------------------
Process exited with return value 0
Press any key to continue . . .
原因同上一个问题,因为a,b都是整形数,虽然c是float型,但是在执行赋值语句前,两个整形数相除,结果仍然会是整形数,然后虽然赋值给了float类型的c,但已经计算完结果,无济于事了。
如果想使结果为真正地实型数,则需要让a,b中有一个为float型即可。
把c=a/b改为:
c=(float)a/b;或c=a*1.0/b;
问题虽小,却往往容易忽略,写下作为提醒吧。
5282

被折叠的 条评论
为什么被折叠?



