大家看看我这个大数相乘有什么问题,主要是函数返回处有问题。

kei_lin kei_lin 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

#pragma once
#include <iostream>
using namespace std;
class BigNum1
{
public:
BigNum1(void);
~BigNum1();
BigNum1(int *, int);
BigNum1(BigNum1&);
BigNum1& operator=(BigNum1 BigOne);
BigNum1& operator*(BigNum1 &bigOne);
BigNum1& operator+(BigNum1 &bigOne);
friend ostream& operator<<(ostream &os, BigNum1 &BigOne);
private:
long nlen;
int *pData;
};


BigNum1::BigNum1(void)
{
nlen = 0;
pData = NULL;
}

BigNum1::~BigNum1(void)
{
if (nlen != 0)
{
nlen = 0;
delete[] pData;
pData = NULL;
}
}

BigNum1::BigNum1(int *data, int len)
{
nlen = len;
pData = new int[nlen];
memcpy(pData, data, 4 * len);
}

BigNum1::BigNum1(BigNum1& BigOne)
{
if (this == &BigOne )
{
return;
}
nlen = BigOne.nlen;
if (pData)
{
delete[] pData;
pData = NULL;
}
pData = new int[nlen];
memcpy(pData, BigOne.pData, nlen * 4);
}

BigNum1& BigNum1::operator=(BigNum1 bigOne)
{
if (this == &bigOne)
{
return *this;
}

if (pData)
{
delete [] pData;
pData = NULL;
}
nlen = bigOne.nlen;
pData = new int[nlen];
for (int i = 0; i < nlen; i++)
{
pData[i] = bigOne.pData[i];
}
return (*this);
}

BigNum1& BigNum1::operator+(BigNum1 &bigOne)
{
long Maxlen = nlen > bigOne.nlen?nlen + 1: bigOne.nlen + 1;
BigNum1 bigSum;
bigSum.nlen = Maxlen;
bigSum.pData = new int[Maxlen];
memset(bigSum.pData, 0, 4 * Maxlen);
int k = 0;
for (int i = 0 ; i < Maxlen; i++)
{
int a, b;
a = 0;
b = 0;
if (i < nlen)
{
a = pData[i];
}
if (i < bigOne.nlen)
{
b = bigOne.pData[i];
}
int sum = a+ b + k;
k = sum / 10;
bigSum.pData[i] = sum %10;
}
return bigSum;
}

BigNum1& BigNum1::operator*(BigNum1& bigOne)
{
BigNum1 IData;
long maxLen = nlen + bigOne.nlen;
IData.nlen = maxLen;
IData.pData = new int[maxLen];
memset(IData.pData, 0, IData.nlen * 4);
for (int i = 0; i < nlen; i++)
{
BigNum1 Jdata;
Jdata.nlen = maxLen;
Jdata.pData = new int[maxLen];
memset(Jdata.pData, 0, Jdata.nlen * 4);
int a = 0;
int b = 0;
for (int j = 0; j < bigOne.nlen; j++)
{
int sum = pData[i] * bigOne.pData[j];
sum += a;
a = sum/ 10;
b = sum % 10;
Jdata.pData[i+j] = b;
}
/* if (a != 0)
{
Jdata.pData[i + bigOne.nlen] = a;
}*/
IData = IData + Jdata;
}
cout<<IData;
return IData;
}

ostream& operator<<(ostream& os, BigNum1 &bigOne)
{
for ( int i = bigOne.nlen - 1; i >= 0; i--)
{
os<<bigOne.pData[i];
}
return os;
}

#include "stdafx.h"
#include "BigNum1.h"

int _tmain(int argc, _TCHAR* argv[])
{
int np[] = {1,1};
int nq[] = {2,1};
//BigNum1 one(np, 2);
BigNum1 two(nq, 2);
two = two * two;
cout<<two<<endl;
return 0;
}
多谢了。
...全文

相关推荐

C++实现大数相乘的算法

这样,我们就实现了一个简单但功能完整的大数相乘算法,能够处理任意长度的字符串表示的大数相乘问题。

weixin_38650516

大数相乘算法解析,实现20位的大数相乘

【大数相乘算法解析】在计算机科学中,处理大数是常见的问题,尤其是在加密算法、数学计算或金融计算等领域。对于20位左右的大数相乘,我们可以通过设计特定的算法来高效地完成。

fling301

大数相乘解决无限位数相乘问题

在计算机科学领域,大数相乘是处理超过标准整型或浮点型变量所能表示的数值范围时必须面对的问题。

lyl870821

两个大数相乘算法

在这个问题中,我们关注的是大数相乘算法。常见的大数相乘方法有以下几种:1. **暴力乘法**:这是最直观的方法,类似于小学数学中的竖式乘法。对于两个n位的大数,其复杂度为O(n^2)。

darrent288

大数相乘——分治法(lua版)

首先,什么是大数相乘?大数相乘通过字面的意思也能知道,就是量很大的相乘。他的解法有很多种,想穷举,分治法等等。但是如果是通过穷举法来解决大数相乘,他的时间复杂度是n的平方。但是,如果使用分治法,它的时间复杂度就降低很多。 在这里,我们不讲怎么用穷举法来实现大数相乘。这个方法的原理很简单,就是利用的是乘法的规则来实现。 使用分治法来实现大数相乘他的原理,这个每一本算法书上都有,就不在这里写了。

Davout_Ling
评论 9
收藏 已收藏
分享
返回顶部
kei_lin
C++ 语言 65,214 成员 250,514 内容