#include <iostream>
using namespace std;
#include <stdio.h>
#include "BigInteger.h"
BigInteger::BigInteger() //构造函数,将每个节点置空.
{
Head=End=TempNode=NULL;
}
BigInteger::BigInteger(const BigInteger &BigNum) //拷贝构造
{
Node *p;
Head=End=TempNode=NULL;
p=BigNum.Head;
while(p)
{
AddEnd(p->Num);
p=p->Next;
}
}
BigInteger::~BigInteger() //析构
{
Node *NextNode;
if(Head==NULL)
return;
TempNode=Head;
while(TempNode)
{
NextNode=TempNode->Next;
delete TempNode;
TempNode=NextNode;
}
Head=NULL;
End=NULL;
TempNode=NULL;
}
void BigInteger::AddHead(char Num) //在链表头插入节点的操作
{
TempNode=new Node;
TempNode->Num=Num;
TempNode->Prev=NULL;
if(!Head)
{
Head=End=TempNode;
TempNode->Next=NULL;
}
else
{
TempNode->Next=Head;
Head->Prev=TempNode;
Head=TempNode;
}
}
void BigInteger::AddEnd(char Num) //在链表尾插入节点的操作
{
TempNode=new Node;
TempNode->Num=Num;
TempNode->Next=NULL;
if(!Head)
{
Head=End=TempNode;
TempNode->Prev=NULL;
}
else
{
TempNode->Prev=End;
End->Next=TempNode;
End=TempNode;
}
}
void BigInteger::GetNumber() //输入部分
{
char key;
int count=0,num=0;
while((key=getchar()) != '\n') //判断输入的是否是回车,不是的话将内容从后到前放到链表中.
{
if(key>='0' && key<='9')
{
num=key-'0';
AddEnd(num);
num=0;
}
}
}
BigInteger BigInteger::operator + (const BigInteger &BigNum2) //重载"+"
{
BigInteger &BigNum1=*this,result;
Node *temp1,*temp2;
int TempNum,rest=0;
temp1=BigNum1.End; //将临时链表首地址放置到输入链表的尾部
temp2=BigNum2.End;
while(temp1 && temp2)
{
TempNum=int(temp1->Num)+int(temp2->Num)+rest; //节点内元素相加并加上进位rest
if(TempNum>9) //判断相加结果是否会产生进位.
{
TempNum=TempNum-10;
rest=1;
}
else
rest=0;
result.AddHead(char(TempNum)); //将结果放置到最终结果链表里
temp1=temp1->Prev;
temp2=temp2->Prev;
}
if(temp2)temp1=temp2;
while(temp1)
{
int(TempNum)=int(temp1->Num)+rest; //节点内元素加上进位rest
if(TempNum>9)
{
TempNum=TempNum-10;
rest=1;
}
else
rest=0;
result.AddHead(char(TempNum)); //将结果放置到最终结果链表里
temp1=temp1->Prev;
}
if(rest)
result.AddHead(char(rest)); //考虑最后的进位是否存在,如果存在则存入链表的首部.
return result;
}
BigInteger BigInteger::operator * (const BigInteger &BigNum2) //对*进行重载
{
BigInteger &BigNum1=*this,temp,result;
Node *temp1,*temp2,*tempa,*tempb;
int TempNum,rest,i=0,rest2;
temp1=BigNum1.End;
temp2=BigNum2.End;
while(temp2) //由乘数的存在与否判断是否去乘被乘数的每个位
{
rest=0;
while(temp1!=NULL)
{
TempNum=int(temp1->Num)*int(temp2->Num)+rest;
if(TempNum>9)
{
rest=TempNum/10; //进位由相乘结果与10做商求得
TempNum=TempNum%10; //由相乘结果与10求模取个位
}
else
rest=0;
temp.AddHead(char(TempNum)); //存入临时链表
temp1=temp1->Prev;
}
if(rest!=0)temp.AddHead(char(rest));
for(int k=i;k>=1;k--)temp.AddEnd(char(0)); //判断应该在链表后面补几个0
i++; //每次乘完后计数,用来下一次的补0
temp1=BigNum1.End; //把被乘数重新置到尾,用来让乘数下一次去乘每个元素
temp2=temp2->Prev; //将乘数取出链表的前驱
tempa=result.End; //下面进行的是将每次乘数与被乘数的相乘结果累加放到最终链表里等待输出
if(result.Head!=NULL) //下面过程与"+"重载基本一样,只是多了对临时链表的置空,所以不在做详细的注释.
{
result.End=temp.Head;
result.Head=NULL;
}
tempb=temp.End;
rest2=0;
while(tempa!=NULL && tempb!=NULL)
{
TempNum=int(tempa->Num)+int(tempb->Num)+rest2;
if(TempNum>9)
{
TempNum=TempNum-10;
rest2=1;
}
else
rest2=0;
result.AddHead(char(TempNum));
tempa=tempa->Prev;
tempb=tempb->Prev;
}
if(tempb)tempa=tempb;
while(tempa)
{
int(TempNum)=int(tempa->Num)+rest2;
if(TempNum>9)
{
TempNum=TempNum-10;
rest2=1;
}
else
rest2=0;
result.AddHead(char(TempNum));
tempa=tempa->Prev;
}
if(rest2)
result.AddHead(char(rest2));
if(temp.Head!=NULL)
{
temp.End=temp.Head;
temp.Head=NULL;
}
tempb=NULL;
}
return result;
}
BigInteger BigInteger::operator = (const BigInteger &BigNum) //对=号进行重载
{
if(this==&BigNum)
return *this;
Node *p;
TempNode=Head=End=NULL;
p=BigNum.Head;
while(p)
{
AddEnd(p->Num);
p=p->Next;
}
return *this;
}
void BigInteger::disp() //输出链表
{
if(Head)
{
cout<<int(Head->Num);
TempNode=Head->Next;
}
else return;
while(TempNode)
{
cout<<int(TempNode->Num);
TempNode=TempNode->Next;
}
cout<<endl;
}
没有合适的资源?快使用搜索试试~ 我知道了~
Large-Int-Multi(list).zip_large_int_largeint.h
共30个文件
tlog:9个
log:2个
cpp:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 104 浏览量
2022-09-24
05:39:41
上传
评论
收藏 4.74MB ZIP 举报
温馨提示
大整数相乘,使用链表的方式实现的,能够正确演示结果
资源推荐
资源详情
资源评论
收起资源包目录
Large-Int-Multi(list).zip (30个子文件)
1106 大整数乘法(链表方式)
1106 大整数乘法(链表方式).sln 969B
1106 大整数乘法(链表方式)
1106 大整数乘法(链表方式).vcxproj.filters 1KB
1106 大整数乘法(链表方式).vcxproj 3KB
BigInteger.cpp 5KB
main.cpp 585B
BigInteger.h 480B
1106 大整数乘法(链表方式).vcxproj.user 143B
Debug
vc100.idb 275KB
CL.write.1.tlog 1KB
CL.read.1.tlog 18KB
mt.read.1.tlog 1KB
1106 大整数乘法(链表方式).exe.intermediate.manifest 381B
1106 大整数乘法(链表方式).log 3KB
mt.command.1.tlog 528B
cl.command.1.tlog 1KB
main.obj 48KB
link.write.1.tlog 856B
1106 大整数乘法(链表方式).lastbuildstate 79B
1106 大整数乘法(链表方式).Build.CppClean.log 2KB
link.command.1.tlog 1KB
link.read.1.tlog 3KB
mt.write.1.tlog 330B
vc100.pdb 236KB
BigInteger.obj 42KB
ipch
1106 大整数乘法(链表方式)-9974bdd0
1106 大整数乘法(链表方式)-ba261aab.ipch 13.69MB
Debug
1106 大整数乘法(链表方式).pdb 547KB
1106 大整数乘法(链表方式).exe 41KB
1106 大整数乘法(链表方式).ilk 375KB
1106 大整数乘法(链表方式).suo 14KB
1106 大整数乘法(链表方式).sdf 5.71MB
共 30 条
- 1
资源评论
小波思基
- 粉丝: 72
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功