⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bignum.h

📁 大数运算的设计与实现
💻 H
📖 第 1 页 / 共 3 页
字号:
		
		p=p->ahead;//
	}
 
	p1=rear;

	if(c!=0)//表示最高位有进位位
{
	
		p1=big_numnodeinsert(rear,0,1 ,'0'+c);//结点插入操作p1为尾节点		
}
 
return p1; //返回头节点
 
}
 big_numnode *  bignum_operation::big_numMUL(char  a[],char b[])//大数乘法
 {
	 big_numnode *r,*t,*p,*q,*p1,*p2;  //  存储创建的两个链表的尾结点
   
	 int n=0;  
 
	 r=creatlinklist(a);// 创建双向链表
     
	 t=creatlinklist(b);// 创建双向链
	  
	 linklist_length( r);
	  
	 int n1=n_inter;//存储链表r整数部分位数
	  
	 int n2=n_small;//存储链表r小数部分位数
	  
	 linklist_length( t);
	  
	 int n3=n_inter;//存储链表t整数部分位数
	  
	 int n4=n_small;//存储链表t小数部分位数
      
	 if(n2!=0)
      
		 r= deletpoint(r);//删除小数点操作
      
	 if(n4!=0)
	 
		 t=   deletpoint(t);//删除小数点操作
	  
	 if((n1+n2)>=(n3+n4))//判断两个大数的位数大小大者做被乘数
	  {
		 p=r; q=t;
	  }
	  
	 else{
	     
		 p=t;q=r;
	  }
	  
	 int j=0;
	 
	 n=n2+n4; 
		   
	 while(q->ahead!=NULL)//外层循环用来控制乘数次数循环次数由乘数位数决定
	  {
		 j++;//控制移位次数
	   
		 if(j==1)
	   {
			 p1=  big_numMUL1(p,q->data);//生成第j趟乘法链
			 
			 q=q->ahead; 
			 if(q->ahead==NULL)
		   
				 break;	   
		 }
			 
		 if(q!=NULL){
			 
			 p2=  big_numMUL1(p,q->data);//生成第j+1趟乘法链
		  
			 p2=	MULmoveleft(p2,j,0);//乘法移位操作,p3为尾节点
		 
		  
			 p1= big_numADD(p1,p2 , 1);//大数加法具体操作
			 
			 q=q->ahead;
			 }
	 }  
	  
	 addpoint(p1,n);//乘除法增加小数点操作
	  
	 while(p1->ahead->ahead)
		  
		 p1=p1->ahead;
	  
	 return p1;

 }

big_numnode * bignum_operation::linklist_length(big_numnode * rear)//用于大数整数部分和小数部分长度 
{
	int  j=0;

	n_inter=0;
	n_small=0;

	big_numnode *q=rear;
	while(q->ahead!=NULL)
	{
 
		n_inter++;
  
		if(q->data=='.')
  {
			n_small= n_inter-1;
    
			n_inter=0;
  }  
  
		q=q->ahead;
  
 
	}

	return q;
}



 big_numnode * bignum_operation:: creatlinklist( char a[])// 创建双向链表
{
		
	 big_numnode * head;
		 
	 int i=0;
       
	 head=new  big_numnode;//头结点
	 
	 head->data='0';
		
	 head->ahead=head->next=NULL;
	
	 big_numnode * rear,*q,*p;  //  尾结点
 
	 p=q=head;
	 

		while(( a[i]-'0'>=0)&&( a[i]-'0'<=9)&&( a[i]!='/0')|| a[i]=='.')  
		{
			p=new  big_numnode;
			
			p->data= a[i];
							
			p->ahead=p->next=NULL;
							
			q->next=p;
						
			p->ahead=q;
                             
			q=p;
							 
			p=p->next;
		                 
		i++;
							
		}
		rear=q;
        
		return rear;//返回尾指针

}

 
 
 int bignum_operation::  big_numCOMPARE(big_numnode * rear1,big_numnode * rear2)//大数绝对值的比较
 { 
          //如果 rear1大于rear2,就反回1,否则返回0
 
	 big_numnode *q,*p,*q1,*p1;  //  两个链表的尾结点
  
	 int  i1=0;
  
	 int  i2=0;
  
	 q1=q= rear1;
  
	 p1=p= rear2;
 
	 rear1->next=NULL;

	 rear2->next=NULL;
  
  while(q1->ahead)//
	 
	  q1=q1->ahead;

  while(p1->ahead)//得到头节点
	  
	  p1=p1->ahead;

  linklist_length(q);//用于计算大数整数部分和小数部分长度

  i1=n_inter;

  linklist_length( p);//用于计算大数整数部分和小数部分长度

  i2=n_inter;

  if(i1>i2)//rear1 链表的整数部分大于rear2上的整数部分位数

	  return 1;

  else if(i1<i2)  return 0;

  else if(i1==i2) {

	  q1=q1->next;

	  p1=p1->next;

	  while(q1!=NULL)
	  {
		  if((q1->data-'0')>(p1->data-'0'))

			  return 1;

		  else  if((q1->data-'0')<(p1->data-'0'))
         
			  return 0;

		  else  {  
			  q1=q1->next;
			  p1=p1->next;
		  }
		 
	  }

	  if(q1==NULL)//表示两个数相等

				  return 1;


  }



 }
 

 
big_numnode *bignum_operation::big_numnodeinsert(big_numnode * p,int i,int n, char c)//结点插入操作 
{
/*i=0,表示向前插入,i=1表示向后插入,n 控制插入的结点个数,p 是尾结点*/
//p传入参数是尾节点,返回值也是尾节点
	big_numnode  *rear,*p1,*h;
       rear=p; 
	  
	   
	   if(n>0&&i==1)//尾插
{
	for(int j=0;j<n;j++)
	{
	p1=new  big_numnode;
	p1->data=c;
     p1->ahead=p1->next=NULL;
	 p->next=p1;
	 p1->ahead=p;
	 p=p->next;
	} 
rear= p1;
}

if(n>0&&i==0)
{
	int j=0;
	while(p->ahead!=NULL)//向前搜索到头节点
	{p=p->ahead;
	}
     h=p->next;//h 记录头节点后的节点	
	while(j<n)
	{
	p1=new  big_numnode;
	p1->data=c;
     p1->ahead=p1->next=NULL;
	 p1->next=h;
     h->ahead=p1;
	 p->next=p1;
	 p1->ahead=p;
	 h=h->ahead;
	j++;
	}

}
return rear;

}


big_numnode *bignum_operation::big_numADD(big_numnode *rear1,big_numnode *rear2, int op)//大数加法具体操作
{//乘法时不考虑小数点,按位加,rear2 长度大于rear1
    big_numnode *p1,*p2;
      
	int s=0;
	
	int c=0;
    
	p1=rear2;
    	 
	p2=rear1;//初始化
	if(op==1)//加法标志
	{
		while((p1->ahead!=NULL)&&(p2->ahead!=NULL))
	{	
			s=(p1->data-'0'+p2->data -'0'+c)%10;
		
			c=(p1->data -'0'+p2->data -'0'+c)/10;
		
			p1->data=s+'0'; //本位数值
		
			p2->data=s+'0';
		
			p1=p1->ahead;  p2=p2->ahead; //链表指针向前移动
	}


if(c==0)
{
		if(p1->ahead!=NULL)
		{
			free(rear1);
	
			return  rear2;
			}
	
		if(p2->ahead!=NULL){
	
			free(rear2); return rear1;
			}
}
if(c!=0)
{

	if(p1->ahead!=NULL)
{
		s=   (p1->data-'0'+c)%10;
	
		c=(p1->data -'0'+c)/10;

		p1->data=s+'0';
  
		if(c!=0)
	
			p1=big_numnodeinsert(rear2,0,1 ,'0'+c);//结点插入操作p1为接收到的尾结点
	
		free(rear1);
		return rear2;
}

else if(p2->ahead!=NULL)
{
	s=(p2->data-'0'+c)%10;
	
	c=(p2->data -'0'+c)/10;
    
	p2->data=s+'0';
	
	if(c!=0)
		
		p1=big_numnodeinsert(rear1,0,1 ,'0'+c);//结点插入操作p1为接收到的尾结点
	
	free(rear2);
    
	return rear1;
}

else 
{
	p1=big_numnodeinsert(p1,0,1 ,'0'+c);//结点插入操作p1为接收到的尾结点

	free(rear1);

	return rear2;
}

}

}


}


 big_numnode *bignum_operation::big_numADD(big_numnode *rear1,big_numnode *rear2, int n1,int n2,int n3,int n4,int op)//大数加法具体操作 
 {/*i=0,表示向前插入,i=1表示向后插入,n 控制插入的结点个数, op 标志是加法还是减法:0 减法,1是加法*/
	big_numnode *p,*p1,*p2;
     
	int s=0;
	 
	int c=0;
	 
	p1=rear1;
	 
	p2=rear2;//初始化
	 sign=	big_numCOMPARE(rear1, rear2);//大数绝对值的比较
	  
	 if(n1<n3)
	 {
		  p=rear1;
	 
		  p1=big_numnodeinsert(p,0,n3-n1,'0');//结点插入操作p1为接收到的尾结点
	 } 
	if(n1>n3)
		 {	
		p=rear2;

		p1=big_numnodeinsert(p,0,n1-n3,'0');//结点插入操作p1为接收到的尾结点
	
		p2=rear1;
	
	}


	 if(n2<n4)
	 {


		 p=rear1;


		 p2=big_numnodeinsert(p,1,n4-n2 ,'0');//结点插入操作p1为接收到的尾结点
	 }
if(n2>n4)
{
	p=rear2;
	 
	p1=big_numnodeinsert(p,1,n2-n4,'0');//结点插入操作p1为接收到的尾结点

	p2=rear1;	 
}
if(op==1)//加法标志
{
	
	while((p1->ahead!=NULL)&&(p2->ahead!=NULL))
	{
		if(p1->data!='.'&&p2->data!='.')
		{	
			s=   (p1->data-'0'+p2->data -'0'+c)%10;
		
			c=(p1->data -'0'+p2->data -'0'+c)/10;
		
			p1->data=s+'0'; //本位数值
		}
		
		p1=p1->ahead;  
		p2=p2->ahead; //链表指针向前移动

		
		}

if(c!=0)//表示最高位有进位位
{
	p1=big_numnodeinsert(p,0,1 ,'0'+c);//结点插入操作p1为接收到的尾结点
}
}
if(op==0)
{// 减法标志
   c=0;
   s=0;
if(sign==1)
	 {p1=rear1;
	 p2=rear2;//初始化
	 }
   if(sign==0)
	 {p2=rear1;
	 p1=rear2;//初始化
   }
while((p1->ahead!=NULL)&&(p2->ahead!=NULL))
	{
		if(p1->data!='.'&&p2->data!='.')
		{	
		      if(p1->data>=p2->data)	
			  {
			s=   p1->data-p2->data ;
	
		p1->data=s+'0'; //本位数值
			  c=0;
			  }
		
			  else {
				 
			  s=   p1->data+10 -p2->data ;
              c=-1;
	
		p1->data=s+'0'; //本位数值
			  
			  }
	
	  
	}

         p1=p1->ahead;  p2=p2->ahead; //链表指针向前移动
	     if(c!=0)
			
			 p1->data=p1->data-1;}
	

}

if(sign==0&&op==0)
{
 p1->data='-';//判断是否是负数,若是则符号存储在头节点	
return p1;
}
else
return p1->next;


/////////////////////////////


}
 
   big_numnode * bignum_operation::big_numADD(char a[],char b[])//大数加法
{
      big_numnode *r,*t;  //  存储创建的两个链表的尾结点
     
	  r=creatlinklist(a);// 创建双向链表
      
	  t=creatlinklist(b);// 创建双向链
	  
	  linklist_length( r);
	  
	  int n1=n_inter;//存储链表r整数部分位数
	  
	  int n2=n_small;//存储链表r小数部分位数
	  
	  linklist_length( t);
	  
	  int n3=n_inter;//存储链表t整数部分位数
	  
	  int n4=n_small;//存储链表t小数部分位数
	  
	  r= big_numADD(r,t,  n1, n2, n3, n4 ,1);//大数加函数 返回链表头部指针
	
	  return r;
}
big_numnode *bignum_operation::big_numSUB(big_numnode *r ,big_numnode *t )//大数减法
 {
      linklist_length( r);
	  int n1=n_inter;//存储链表r整数部分位数
	  int n2=n_small;//存储链表r小数部分位数
	  linklist_length( t);
	  int n3=n_inter;//存储链表t整数部分位数
	  int n4=n_small;//存储链表t小数部分位数  
   
	  sign=	big_numCOMPARE(r, t);//大数绝对值的比较

r= big_numADD(r,t,  n1, n2, n3, n4 ,0);//大数减法函数 返回链表指针

 while(r->next!=NULL)
	{ r=r->next;
	}

return r;
 
 }








big_numnode *bignum_operation::big_numSUB(char a[],char b[])//大数减法
 {
   big_numnode *r,*t;  //  存储创建的两个链表的尾结点
      
   r=creatlinklist(a);// 创建双向链表
      
   t=creatlinklist(b);// 创建双向链
	  
   linklist_length( r);
	  
   int n1=n_inter;//存储链表r整数部分位数
	  
   int n2=n_small;//存储链表r小数部分位数
	  
   linklist_length( t);
	  
   int n3=n_inter;//存储链表t整数部分位数
	  
   int n4=n_small;//存储链表t小数部分位数  
      
   sign=	big_numCOMPARE(r, t);//大数绝对值的比较


   r= big_numADD(r,t,  n1, n2, n3, n4 ,0);//大数加函数 返回链表指针

	return r;
 
 }



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -