A*B问题

描述

输入两个正整数A和B,求A*B。

输入一行,包含两个正整数A和B,中间用单个空格隔开。1 <= A,B <= 50000。输出一个整数,即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;

问题虽小,却往往容易忽略,写下作为提醒吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值