深入分析C++中两个大数相乘结果不正确的问题
2013-05-16 11:36
791 查看
在编写代码做测试时发现两个大数相乘结果不正确的问题,测试代码如下:
#include "stdafx.h"
#include<stdlib.h>
#include<time.h>
int _tmain(int argc, _TCHAR* argv[])
{
time_t temp1=1345172428000000;
time_t temp2=1345172428*1000000;
::system("pause");
return 0;
}
经过测试发现temp1与temp2并不相等。
但是修改为如下代码:
#include "stdafx.h"
#include<stdlib.h>
#include<time.h>
int _tmain(int argc, _TCHAR* argv[])
{
time_t temp1=1345172428000000;
time_t temp3=1345172428;
time_t temp4=1000000;
time_t temp2=temp3*temp4;
::system("pause");
return 0;
}
经过测试发现temp1与temp2并相等。
分析原因:
1345172428和1000000都是当做int型来处理的,他们相乘的结果也是当做int型,只是乘积会被强制转换成time_t,但是在求乘积的时候就已经溢出了,所以在转换成time_t也是错的。
结论:
在大数乘法时需要考虑乘积溢出问题。
#include "stdafx.h"
#include<stdlib.h>
#include<time.h>
int _tmain(int argc, _TCHAR* argv[])
{
time_t temp1=1345172428000000;
time_t temp2=1345172428*1000000;
::system("pause");
return 0;
}
经过测试发现temp1与temp2并不相等。
但是修改为如下代码:
#include "stdafx.h"
#include<stdlib.h>
#include<time.h>
int _tmain(int argc, _TCHAR* argv[])
{
time_t temp1=1345172428000000;
time_t temp3=1345172428;
time_t temp4=1000000;
time_t temp2=temp3*temp4;
::system("pause");
return 0;
}
经过测试发现temp1与temp2并相等。
分析原因:
1345172428和1000000都是当做int型来处理的,他们相乘的结果也是当做int型,只是乘积会被强制转换成time_t,但是在求乘积的时候就已经溢出了,所以在转换成time_t也是错的。
结论:
在大数乘法时需要考虑乘积溢出问题。
相关文章推荐
- 两个大数相乘的C++实现
- C语言实现两个大数相乘问题
- C#中两个static函数互相递归调用时,递归结果不正确的问题
- ZOJ 1205题解本来是一道大数运算水题,可是却纠结了很久,原因是没能真正读懂题意,要求的计算必须是一一对应输出即使前面出现几个0最后也要把前面的0输出,看别人用C++自己还是两个都提交了结果还是C占的内存少。
- 数学问题3:两个大数相乘
- [C++] cout、wcout无法正常输出中文字符问题的深入调查(2):VC2005的crt源码分析
- 在VS2005下用C++写的程序,安装到另一台未安装VS2005的电脑上,结果出现如下的问题:““由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”。在我自己的机子上就能正常安装运行。查了一下网上的方法: 方法一: 在类似
- C++实现——两个大数相乘
- leetcode_[python/C++逐步深入] 43. Multiply Strings_(大数乘法分析)
- 深入分析 Java 中的中文编码问题
- c++ 虚函数与纯虚函数的区别(深入分析)
- 两个大数(50位以上)相乘
- C++实现的大数相乘算法示例
- Android关于Theme.AppCompat相关问题的深入分析(转)
- c++中两个类互相引用的问题
- 深入分析java中文乱码问题
- C++头文件重复包含问题分析及解决方案
- C++中两个大整数相乘
- PInvoke调用导致堆栈不对称 c#调用C++win32非托管dll的问题深度分析