📄 updatados2007.cpp
字号:
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 + -