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

📄 updatados2007.cpp

📁 大数运算的设计与实现
💻 CPP
📖 第 1 页 / 共 3 页
字号:

		free(rear2);
		return rear1;
	}
	
	if(p1->ahead==NULL&&p1->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);//大数加函数 返回链表尾部指针
	
    linklist_print(r);//链表的输出函数,参数rear为尾部指针
    
      if(!strcmp(keysave,"1"))

		writeFILE("运算编辑.txt",r,0);//文件存储函数
	
	return 0;
}
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;
 
 }
 void bignum_operation::readFILE(char filename[])//文件读取函数	
{
char  filenum;
int j=0;
	
	in_stream.open( filename);
	
	if(in_stream.fail())
	 {
		cout<<filename<<" file open faild.\n";
             
		exit(0);
	 }

in_stream>>filenum;
while(!in_stream.eof()&&(-1<filenum-'0')&&(filenum-'0')<10)
{
		arrange.h1[j]=filenum;
		j++;
		in_stream>>filenum;

}
	arrange.h1[j]='\0';

	arrange.op2=filenum;

	in_stream>>filenum;
	
	j=0;

while(!in_stream.eof())
{			if((-1<filenum-'0')&&(filenum-'0')<10)
				arrange.h2[j]=filenum;
				j++;
				in_stream>>filenum;

}
		arrange.h2[j]='\0';




 
in_stream.close();

}

void bignum_operation::writeFILE(char filename[],big_numnode *t, int i)//文件存储函数	
{

int j=0;
	
out_stream.open( filename,ios::trunc);
	
	if(out_stream.fail())
	 {
		cout<<filename<<" file open faild.\n";
             
		exit(0);
	 }
if(i!=2)
{	out_stream<<arrange.h1<<endl<<endl;
	
	out_stream<<arrange.op2<<endl<<endl;
	
	out_stream<<arrange.h2<<endl;	
}
if(i==2)
	
{	out_stream<<arrange.a1<<endl;
	
	out_stream<<arrange.op2<<endl;
	
	out_stream<<arrange.b1<<endl;	
}


out_stream<<"=      "<<endl;
if(i!=3&&i!=1)
	while(t!=NULL)
	{  
		out_stream<<t->data;
	t=t->next;
	}


	if(i!=3&&i==1)
while(t->ahead)
	{  
		out_stream<<t->data;
	t=t->ahead;
	}




	 
if(i==3)
{if(k==1)
out_stream<<" 操作数1      大于    操作数2  \n";

else  out_stream<<" 操作数1     小于    操作数2  \n";

}


	
	
	out_stream.close();

}

/*-------------------任意进制转换类------------------*/

class enchange{
public:
	~enchange();	
	 enchange();
     big_numnode *changeINTO(char a[],char f[]);
        




}enchange;

enchange::enchange()
{
//进制转换

}

enchange::~enchange()
{
//进制转换

}
big_numnode *enchange::changeINTO(char a[],char f[])//
{//任意进制到 二进制,十六进制,八进制转化
//f=2; f=8; f=16分别为转换的进制类型	
	big_numnode *t1,*t2,*t3,*t4;
	t1=t2=t3=t4=NULL;
	int j=0;
	int n=0;

	while(a[j+1]!='\0')j++;
	n=j;
	int i=0;
		if(a[i]!='0')
{
		t1=bignum_operation.big_numPOWER(f,i);//大数乘方运算

		t2= bignum_operation.big_numMUL1(t1,a[j]);//大数乘法乘数位数字与被乘数相乘
}

	for(i=1;i<=n;i++){
	
		j--;
	if(a[i+1]!='0')
{
		t3=bignum_operation.big_numPOWER(f,i);//大数乘方运算

		t4= bignum_operation.big_numMUL1(t3,a[j]);//大数乘法乘数位数字与被乘数相乘
}
		
t2=bignum_operation.big_numADD(t2,t4, 1);//大数加法具体操作

	
}




return t2;


}





/*----------------------------------------------------*/



big_numnode *bignum_operation::functionchoice(char a[],char b[],char f)
{
	big_numnode* t,*p,*r;
	char f1[5];

	int j=0; 

switch(f){
                if(f=='O'||f=='B'||f=='X'||f=='C')//大小写转换
					f=f-'32';

	case '+':
	              t=big_numADD( a, b);//大数加法
			  	  
				 
			  break;
	case '-':
		
		t=big_numSUB( a, b);//大数减法
	
		linklist_print(t);//输出
		 if(!strcmp(keysave,"1"))
			writeFILE("运算编辑.txt",t,0);//文件存储函数
		
	
	
	break;
	case '*':
		
		t=big_numMUL( a, b);//大数乘法
		while(t->ahead->ahead)t=t->ahead;
			linklist_print(t);
	
			 if(!strcmp(keysave,"1"))
				 writeFILE("运算编辑.txt",t,0);//文件存储函数
	
			
			
			break;	
	case '/':
		
		t=big_numDEVIDE( a, b);//大数乘法
		while(t->ahead){t=t->ahead;}
       
		linklist_print(t);
		if(!strcmp(keysave,"1"))
				 writeFILE("运算编辑.txt",t,0);//文件存储函数
	
		break;	
	case '!':
		
	pa=	factorial.factorialcomputer(a,0);
		
		if(!strcmp(keysave,"1"))
			cout<<a<<"!存储在:   "<<factorial.fileName1<<"   文件中"<<endl;
		
	
	//添加阶乘运算函数
		
		break;	
	case 'o':
		
		
		p=t=big_numENCHANGE( a, f );
	while(t->ahead){
	             cout<<t->data;
	            
				 t=t->ahead;
		}
	if(!strcmp(keysave,"1"))
			 writeFILE("运算编辑.txt",p,1);//文件存储函数

		//二进制转化函数
		
		break;
	    

	case 'b':
		
		
    p=t=big_numENCHANGE( a, f );
	
	while(t->ahead){
	             cout<<t->data;
	             
				 t=t->ahead;
		}
	
	if(!strcmp(keysave,"1"))
			 
		writeFILE("运算编辑.txt",p,1);//文件存储函数

		//二进制转化函数
		
		break;
	    
	case 'x':
		
		
p=	t=	big_numENCHANGE( a, f );
	while(t->ahead){
	             
		cout<<t->data;
	            
		t=t->ahead;
		}
		if(!strcmp(keysave,"1"))
			 writeFILE("运算编辑.txt",p,1);//文件存储函数


		//二进制转化函数
		
		break;
	    
	case 'E':
         cin>>f1;

	t=enchange.changeINTO(a, f1);//
		while(t->ahead->ahead)t=t->ahead;
			linklist_print(t);
	




	case '^':
		
		t=big_numPOWER( a, b);//大数乘法
		while(t->ahead->ahead)t=t->ahead;
			linklist_print(t);
	if(!strcmp(keysave,"1"))
				 writeFILE("运算编辑.txt",t,0);//文件存储函数
		
		
		//乘方运算函数
	break;
	
	case 'c'://排列组合
	
	strcpy(arrange.a1,a);
	strcpy(arrange.b1,b);
		
		t=arrange.arrangecomputer(a, b);//排列组合的实现
	while(t->ahead){
			t=t->ahead;
		if(t->next->data=='.')t->next=NULL;

		
		}
       
		
		t=t->next;
       linklist_print(t);
	if(!strcmp(keysave,"1"))
		 writeFILE("运算编辑.txt",t,2);//文件存储函数
		

		break;
	case '&'://比较大小
		

      //  存储创建的两个链表的尾结点
      r=creatlinklist(a);// 创建双向链表
      t=creatlinklist(b);// 创建双向链
      k=big_numCOMPARE(r,t);//大数绝对值的比较
        if(k==1)
        cout<<a<<"   大于  "<<b<<endl;
		else 
			cout<<a<<"   小于  "<<b<<endl;
		
			if(!strcmp(keysave,"1"))
		 writeFILE("运算编辑.txt",t,3);//文件存储函数
		
		
		break;
	    




	default:
		
		cout<<"!!此操作符 "  <<f<<"非法!!"<<endl<<endl<<"请输入正确的操作符号!!"<<endl;
		cout<<"--------------------------------------------------"<<endl;
        cout<<"加法 +,减法 - ,乘法*,除法 /,阶乘 !,"<<endl;
        cout<<"进制转换十-二:b,进制转换十-八:o进制转换十-十六:x"<<endl;
       
		cout<<"乘幂:^,比较大小:&"<<endl;
		
		cout<<"--------------------------------------------------"<<endl;

	






}


return t;

}







int main()
{
	big_numnode *t;  //  存储创建的两个链表的尾结点
	char key[20];
	char key1;
	char key4[5];
char a[1000];
char f1[5];
  
/*
cout<<"a=";
 cin>>a;
 cout<<"\nf1=";
 cin>>f1;


	t=enchange.changeINTO(a, f1);//
		while(t->ahead)
		{//printf("%c",t->data);
		t=t->ahead;}
		t=t->next;
		bignum_operation.linklist_print(t);
	*/



	cout<<"------------欢迎进入高精密计算系统---------------"<<endl<<endl;
C1:
		while(key1!='3'){
	cout<<"-----1-----计算--------"<<endl;
	cout<<"-----2-----帮助--------"<<endl;
	cout<<"-----3-----退出--------"<<endl<<endl;
	
	cout<<"请输入>>>>>";
	cin>>key1;

	switch(key1){

	case '1':{	
A1:
		
		while(strcmp(key,"0")){
	
			cout<<"\n\n****1****以文件形式输入/输出"<<endl;
			cout<<"****2****从DOS界面输入/输出"<<endl;
			cout<<"****3****返回上一级"<<endl;
			cin>>bignum_operation.keysave;
			if(!strcmp(bignum_operation.keysave,"1"))
			{
B1:	
		   cout<<" 是否已进行运算编辑 y/n?\n\n";
           	
		    cin>>key4;
 
        // CString p="C:\\WINNT\\System32\\notepad.exe";
        // ::ShellExecute(NULL,"open",p,NULL,NULL,SW_SHOWNORMAL);
	 
			if(!strcmp(key4,"Y")||!strcmp(key4,"y"))
			{	bignum_operation.readFILE("运算编辑.txt");//文件读取函数	

			}else{ cout<<"请编辑运算文件:“运算编辑.txt”\n\n";
			goto B1;
			}
			
			}
			
			else if(!strcmp(bignum_operation.keysave,"2"))
			{	
				cout<<endl<<"操作数1"<<endl;
				cin>>arrange.h1;
	
			cout<<"操作符"<<endl;
			cin>>arrange.op2;
			if(arrange.op2!='E'&&arrange.op2!='!'&&arrange.op2!='b'&&arrange.op2!='o'&&arrange.op2!='x')
			{	
				cout<<"操作数2"<<endl;
				cin>>arrange.h2;
			}
			
			}
			else if(!strcmp(bignum_operation.keysave,"3"))
				goto C1;
			
			else 
			{	cout<<"~@~选择错误!"<<endl;
			goto A1;
			}
		
			
		
		cout<<"*************运算结果***************"<<endl<<endl;
			
	    
		
	

	
		t=bignum_operation.functionchoice(arrange.h1, arrange.h2, arrange.op2);
	   
    
	
		cout<<endl<<"************************************"<<endl<<endl;
		
		cout<<"是否继续'0'to end>>>>";

		cin>>key;
		}
		break;
	
			 
			 
			 
			 
			 }
	
	case '2':
		cout<<endl<<"          关于本系统的运算规则"<<endl<<endl;
		cout<<"--------------------------------------------------"<<endl;
        cout<<"加法 +,减法 - ,乘法*,除法 /,阶乘 !"<<endl;
        cout<<"进制转换十-二:b\n进制转换十-八:o\n进制转换十-十六:x"<<endl;
        cout<<"排列组合:c"<<endl;
		cout<<"乘幂:^\n比较大小:&"<<endl;
		cout<<"文件编辑和界面输入 规则完全相同"<<endl;

		
		cout<<"--------------------------------------------------"<<endl;

	break;

	case '3':
			cout<<"         \n~@~欢迎退出大数计算系统~@~"<<endl<<endl;
			exit(0);
			break;
	
	default:
				
			
		
		
		cout<<"选择键错误!"<<endl;


	
	}
		
		
		
		}
		return 1;
}

⌨️ 快捷键说明

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