«June 2019»
1
2345678
9101112131415
16171819202122
23242526272829
30


公告

本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!

             ——既瑜


天气预报(南京)


我的分类(专题)

首页(183)
【趣味文摘】(22)
【五子连珠】(13)
【技术文档】(136)
【电脑技术】(6)
【疑难问题】(1)
【我的心情】(5)


最新日志
花语(中英文对照版)
各种花的花语
NTFS格式的7个精彩问答(pconli
童言无忌,有趣得一蹋
给MM修电脑的三个步骤[转载]
J2EE 面试题综合
JAVA编程规则
[转] P2P之UDP穿透NAT的原理与
[转]词法分析器
文件加密技术
一个让人发狂的PI求解C程序
[转]直线生成算法之DDA
[转]利用内核对象----互斥量实现应用
[转]如何正确的计算文件收发进度
双机调试VC程序
[转]分治法优化大整数乘法 C++实现
浮点数值的内存结构
[转]双链表实现大整数的加法与乘法[VC
拜占廷将军问题[转]
某人的挂QQ的程序源代码,虽然没用了,拿

最新回复
回复:vc中的CString的操作
回复:[转]分治法优化大整数乘法 C++
回复:[转]分治法优化大整数乘法 C++
回复:花语(中英文对照版)
回复:基本排序算法比较与选择[转载]
回复:c++中强制类型转换操作符小结
回复:c++中强制类型转换操作符小结
何必那么执着于是大头猫还是愤怒的小鸟,淡
回复:浮点数值的内存结构
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:32位位图到24位位图的转换
dren, ages 16 and 20
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:各种花的花语

留言板
签写新留言

不是0-1背包喔
桂花的花语``
谢谢
提议
提议

统计
blog名称:★既瑜★
日志总数:183
评论数量:636
留言数量:-25
访问次数:1339524
建立时间:2005年3月12日

链接


http://www.nju.edu.cn
http://bbs.nju.edu.cn 
http://www.t7-online.com
http://www.csdn.net
http://www.91f.net
http://www.crsky.com
我的MSN BLOG 

联系我

  OICQ:215768265
  njucs2001@hotmail.com
  erichoo1982@gmail.com

 

W3CHINA Blog首页    管理页面    写新日志    退出


[【技术文档】][转]双链表实现大整数的加法与乘法[VC++]
既瑜(224499) 发表于 2005-11-25 21:15:35

设计的思想主要是通过双链表来实现的.利用双链表的节点存储每位的数字,利用前驱进行对上一个位数的使用.用后继来连接后面的节点.通过对"+"号和"*"号的重载实现对大整数的加和乘.理论上可以实现N多位的运算,只要你的机器内存够大...程序的重点在于运算符的重载. 本程序主要由三个文件构成: BigInteger.h 包涵了对节点的结构定义,以及类BigInteger的定义. BigInteger.cpp 包涵了BigInteger类里面成员函数的具体内容. main.cpp 主函数... //BigInteger.h struct Node        //定义了节点的结构{ char Num; Node *Prev,*Next;}; class BigInteger      //定义BigInteger 类{ Node *Head,*End,*TempNode; void AddHead(char Num); void AddEnd(char Num); public:  BigInteger();  BigInteger(const BigInteger &BigNum);  void GetNumber();  void disp();  BigInteger operator + (const BigInteger &BigNum);  BigInteger operator * (const BigInteger &BigNum);  BigInteger operator = (const BigInteger &BigNum);  ~BigInteger();}; //BigInteger.cpp #include <iostream.h>#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())!=10)            //判断输入的是否是回车,不是的话将内容从后到前放到链表中. {  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;} //main.cpp #include <iostream.h>#include "BigInteger.h" void main(){ BigInteger BigNum1,BigNum2,BigNum3; int c; cout<<"选择你要进行的操作:"<<endl; cout<<"1.大整数加法运算"<<endl; cout<<"2.大整数乘法运算"<<endl; cout<<"选择你需要进行的运算:"<<endl; cin>>c; switch(c) {  case 1:   {     cout<<"A:"<<endl;    BigNum1.GetNumber();    cout<<"B:"<<endl;    BigNum2.GetNumber();    BigNum3=BigNum1+BigNum2;    cout<<"相加的结果是:"<<endl;    BigNum3.disp();   }break;  case 2:   {    cout<<"A:"<<endl;    BigNum1.GetNumber();    cout<<"B:"<<endl;    BigNum2.GetNumber();    BigNum3=BigNum1*BigNum2;    cout<<"相乘的结果是:"<<endl;    BigNum3.disp();   }break;  default:break; }} Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=535558

阅读全文(8936) | 回复(1) | 编辑 | 精华

回复:[转]双链表实现大整数的加法与乘法[VC++]
hys(游客)发表评论于2006-12-9 14:06:09

调试说打不开头文件 没有头文件 怎么回事呀???

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144281618 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号