#include<iostream>
using namespace std;
int temp,len1,len2;
struct node
{ char a; //输入的字符型数据
int c; //实际运算的数据
int x; //权位
node *next; //链接下一个链表的指针
node *pre; //链接上一个链表的指针
bool sign; //符号位
};
void create(node *&head);//生成双向链表
void show(node *head);
bool ab(node *&head,int &len);//求绝对值
void change(node *head);
node *findend(node *&head);//找到链表的最后一个节点
void alignment(node *&heada,node *&headb,int len1,int len2);
int compare(node *heada,node *headb,int len1,int len2);
void addition(node *enda,node *endb,node *a,node *b,node *&endc,node *&c,int len1,int len2);
void ca(node *head,node *end);
void sub(node *enda,node *endb,node *a,node *b,node *&endc,node *&c,int len1,int len2);
int len(node *head); //计算链表长度
int main()
{ node *a=NULL,*b=NULL,*c=NULL,*d=NULL,*enda=NULL,*endb=NULL,*endc=NULL,*endd=NULL; //定义三个全局变量用以记录两个输入数字的长度(一个数字总共有多少位)
char sign,ctu; //sign记录选择做加法还是减法的符号,ctu记录是否继续运算
bool j1,j2;
int cpr;
cout<<"输入“+”进行高精度加法运算,输入“-”进行高精度减法运算"<<endl;
cin>>sign;
if(sign=='+')
cout<<"请分别输入被加数和加数(以‘z’结尾)"<<endl;
if(sign=='-')
cout<<"请分别输入被减数和减数(以‘z’结尾)"<<endl;
create(a); //输入,转换
len1=temp;
temp=0;
change(a);
create(b);
len2=temp;
temp=0;
change(b);
j1=ab(a,len1); //求绝对值(去掉符号),返回1为正数,0为负数
j2=ab(b,len2);
enda=findend(a);//找尾部
endb=findend(b);
cpr=compare(a,b,len1,len2);//绝对值比较 如果a>b返回1,如果a=b返回0,如果a<b返回-1.
alignment(a,b,len1,len2); //前补对齐
if(sign=='+')
{ if(j1==1)
{ if(j2==1)
{ addition(enda,endb,a,b,endc,c,len1,len2);
ca(c,endc);
show(c);
}
if(j2==0)
{ if(cpr>=0)
{ sub(enda,endb,a,b,endc,c,len1,len2);
ca(c,endc);
show(c);
}
if(cpr==-1)
{ sub(endb,enda,b,a,endc,c,len2,len1);
ca(c,endc);
cout<<"-";
show(c);
}
}
}
if(j1==0)
{ if(j2==0)
{ addition(enda,endb,a,b,endc,c,len1,len2);
ca(c,endc);
cout<<"-";
show(c);
}
if(j2==1)
{ if(cpr>=0)
{ sub(enda,endb,a,b,endc,c,len1,len2);
ca(c,endc);
if(cpr!=0) cout<<"-";
show(c);
}
if(cpr<0)
{ sub(endb,enda,b,a,endc,c,len2,len1);
ca(c,endc);
show(c);
}
}
}
}
if(sign=='-')
{ if(j1==1)
{ if(j2==1)
{ if(cpr>=0)
{ sub(enda,endb,a,b,endc,c,len1,len2);
ca(c,endc);
show(c);
}
if(cpr<0)
{ sub(endb,enda,b,a,endc,c,len2,len1);
ca(c,endc);
cout<<"-";
show(c);
}
}
if(j2==0)
{ addition(enda,endb,a,b,endc,c,len1,len2);
ca(c,endc);
show(c);
}
}
if(j1==0)
{ if(j2==0)
{ if(cpr>=0)
{ sub(enda,endb,a,b,endc,c,len1,len2);
ca(c,endc);
if(cpr!=0) cout<<"-";
show(c);
}
if(cpr<0)
{ sub(endb,enda,b,a,endc,c,len2,len1);
ca(c,endc);
show(c);
}
}
if(j2==1)
{ addition(enda,endb,a,b,endc,c,len1,len2);
cout<<"-";
ca(c,endc);
show(c);
}
}
}
cout<<"运算结束"<<endl;
}
void create(node *&head)
{ node *s,*p;
s=new node;
p=new node;
cin>>s->a;
while(s->a!='z')
{ if(s->a!=',')
{ if(head==NULL)
{ if(s->a=='-') s->sign=0;
head=s;
s->pre=NULL;
}
else if(head!=NULL){ p->next=s;s->pre=p;}
s->x=temp;
temp++;//权位自加
p=s;//p前移
s=new node;
}
cin>>s->a;
}
p->next=NULL;
delete s;
}
int len(node *head)
{ bool j=0;
int len=0;
while(head)
{ if(head->c==0) //如果前面都是0,指针一直往后移动,直到找到不是数值0的节点,跳出此循环
{ head=head->next;
if(head==NULL) return 1;
}
if(head->c!=0) {j=1;break;}
}
while(head)
{ len++;
head=head->next;
}
return len;
}
void show(node *head)
{ bool j1=0,j2=0;//前面的0不输出
int i=0,clen;
clen=len(head);
if(clen>3&&clen%3==1) i=2;
if(clen>3&&clen%3==2) i=1;
while(head)
{ if(head->sign==0) {head=head->next;continue;}
if(head->c!=0) j2=1;
if(j2==1)
{ cout<<head->c;i++;}
head=head->next;
if(i!=0&&i%3==0&&head!=NULL) cout<<','; // 每三位输出一个逗号
}
if(j2==0&&j1==0) cout<<"0"<<endl; //如果全部都是0 则输出一个0
else cout<<endl;
}
bool ab(node *&head,int &len)//求绝对值(去掉符号),返回1为正数,0为负数
{ node *p=NULL;
if(head->sign==0)
{ p=head;
head=head->next;
len--;
head->pre=NULL;
delete p;
return 0;
}
else return 1;
}
void change(node *head) //ASCII码转换成int型
{ while(head)
{ if(head->a=='-') { head->c=0;head=head->next;continue;} //符号位的数值是0(方便输出)
head->c=head->a-48;
head=head->next;
}
}
node *findend(node *&head)//找到链表的最后一个节点
{ node *p;
p=head;
while(p->next)
{ p=p->next;}
return p;
}
void alignment(node *&heada,node *&headb,int len1,int len2)//对齐前补
{ int i,d;
node *p;
if(len1>len2)
{ d=len1-len2;
p=new node;
for(i=0;i<d;i++)
{ p->c=0;
p->next=headb;
headb->pre=p;
headb=p;
if(i==d-1) {p->pre=NULL;break;}
p=new node;
}
headb=p;
}
if(len2>len1)
{ d=len2-len1;
p=new node;
for(i=0;i<d;i++)
{ p->c=0;
p->next=heada;
heada->pre=p;
heada=p;
if(i==d-1) {p->pre=NULL;break;}
p=new node;
}
heada=p;
}
}
int compare(node *heada,node *headb,int len1,int len2) //绝对值比较 如果a>b返回1,如果a=b返回0,如果a<b返回-1.
{ if(len1>len2) return 1;
if(len1<len2) return -1;
if(len1=len2)
{ while(heada)
{ if(heada->c>headb->c) return 1;
if(heada->c<headb->c) return -1;
if(heada->c==headb->c)
{ heada=heada->next;
headb=headb->next;
if(heada==NULL) return 0;
}
}
}
}
void addition(node *enda,node *endb,node *a,node *b,node *&endc,node *&c,int len1,int len2)
{ int maxlen; //建立一个全为0长度为两数字最长者数的链表,记录结果
node *p,*s;
if(len1>len2) maxlen=len1;
else maxlen=len2;
p=new node;
if(maxlen!=1)
for(int i=0;i<maxlen;i++)
{ if(c==NULL) {p->pre=NULL;p->c=0;c=p;continue;}
s=new node;
p->next=s;
s->pre=p;
s->c=0;
if(i==maxlen-1) {s->next=NULL;}
p=s;
}
if(maxlen==1)
{ p=new node;
p->next=NULL;
p->pre=NULL;
p->c=0;
c=p;
}
endc=findend(c);
while(enda) //每个节点相加
{ endc->c=enda->c+endb->c;
enda=enda->pre;
endb=endb->pre;
endc=endc->pre;
}
endc=findend(c);
}
void ca(node *head,node *end) //进位函数
{ int m,n; //M代表留下来的数,N代表需要进的数
while(end->pre)
{ if(end->c>=10)
{ m=end->c%10;
n=end->c/10;
end->pre->c+=n;
end->c=m;
}
if(end->c<0)
{ m=end->c%10;
n=end->c/10-1;
end->pre->c+=n;
end->c=10+m;
}
end=end->pre;
}
}
void sub(node *enda,node *endb,node *a,node *b,node *&endc,node *&c,int len1,int len2)
{ int maxlen; //建立一个全为0长度为两数字最长者数的链表,记录结果
node *p,*s;
if(len1>len2) maxlen=len1;
else maxlen=len2;
p=new node;
if(maxlen!=1)
for(int i=0;i<maxlen;i++)
{ if(c==NULL) {p->pre=NULL;p->c=0;c=p;continue;}
s=new node;
p->next=s;
s->pre=p;
s->c=0;
if(i==maxlen-1) {s->next=NULL;}
p=s;
}
if(maxlen==1)
{ p=new node;
p->next=NULL;
p->pre=NULL;
p->c=0;
c=p;
}
endc=findend(c);
while(enda)
{ endc->c=enda->c-endb->c;//实现减法
enda=enda->pre;
endb=endb->pre;
endc=endc->pre;
}
endc=findend(c);
}
刘良运
- 粉丝: 81
- 资源: 1万+
最新资源
- 基于SAR-ADC与OTA运放的PLL锁相环与Bandgap基准电源视频教学进阶,SAR-ADC 运放OTA PLL锁相环基础,pll进阶 bandgap基准电源 LDO 视频教学 ,SAR-ADC
- "两种方法求解MTPA数值解析详解" 或者 "探讨MTPA数值求解的两种策略",MTPA数值求解两种方法 ,MTPA数值求解; 两种方法; 优化算法; 迭代法; 解析法; 计算方法; 精确度比较 ,M
- 医药洁净室空调箱多模式控制程序详解:西门子PLC与昆仑通泰触摸屏联合应用,停止模式、生产模式、值班模式、消毒循环与排风模式控制逻辑解析,医药洁净室空调箱各种模式实现程序介绍 西门子1500 PLC+昆
- 《Abaqus模拟结构调谐质量阻尼器与惯容器制作教程:飞轮转动惯量与丝杠螺距详解》,abaqus生成结构调谐质量阻尼器和惯容器,模拟丝杠螺距,飞轮转动惯量,惯容系数 视频讲解 ,核心关键词:Abaq
- 电-气-热综合能源系统耦合优化调度模型:基于MATLAB YALMIP与CPLEX、Gurobi求解器的细致文档参考,MATLAB代码:电-气-热综合能源系统耦合优化调度 关键词:综合能源系统 优化
- 基于Ansoft Maxwell的电磁场有限元仿真:无线电能传输与电机建模研究,ansoft ansys Maxwell 有限元仿真 电磁场模型 主要为无线电能传输WPT 磁耦合谐振 多相多绕组变压
- 30KW储能双向逆变PCSPS设计方案资料:含双向DCDC与三电平逆变技术、仿真源码、原理图及控制器源码,30KW储能PCS逆变器双向变流器设计方案资料,双向DCDC和三电平逆变PCS 1.此系列为
- MATLAB驱动的ASR防滑转模型:PID与对照控制算法对比,冰雪路面条件下滑移率与车速轮速对照图展示,MATLAB驱动防滑转模型ASR模型 ASR模型驱动防滑转模型 ?牵引力控制系统模型 选择PID
- MATLAB七自由度分布式驱动电动汽车模型的动态仿真与模糊控制策略探究,MATLAB分布式驱动电动汽车模型 MATLAB七自由度整车模型 分布式驱动电动车整车模型 四轮驱动电动车整车模型 轮毂电机电动
- EPS电动助力转向系统:基于MATLAB/Simulink模型搭建与单模型仿真分析,EPS汽车电动助力转向模型 MATLAB电动助力转向模型 Simulink电动助力转向模型 总体模型搭建包括:EPS
- 高频方波电压注入法用于零低速IPMSM无感控制算法仿真研究:转子位置精确估计与动态性能优化,高频方波电压注入零低速IPMSM无感控制算法仿真,在估计的d轴注入高频方波电压来估计转子位置,具有较高的稳态
- Labview Nivision视觉程序:LV2014版源程序,仿视觉助手功能强大,大部分功能可用,Labview Nivision视觉程序,labview源程序,大部分功能可以用,仿视觉助手的 版
- 基于双闭环SVPWM羊角波调制的二极管钳位型NPC控制系统:理论推导与实践应用,高质量电能输出,功率稳定且波形清晰 ,双闭环SVPWM(羊角波)调制的二极管钳位型NPC控制系统,手写理论推导 DC:8
- RSLogix系列软件授权授权详解与版本更新通知:涵盖RSLogix 5000 Studio编程VMware环境支持及固件版本信息,AB罗克韦尔 RSLogix5000 V10-20.5 Studio
- MATLAB滑动窗口函数:高效生成机器学习样本数据,适用于数据分帧与一维原始数据处理,MATLAB加窗滑动窗口程序,MATLAB数据处理,可以直接对一维原始数据生成样本 找了好久的滑动窗口的程序都
- 移相全桥ZVS零电压开通技术:实现滞后桥臂辅助电流源网络,开关频率达20kHz,功率输出500W,输入与输出电压分别为350V与50V ,移相全桥ZVS零电压开通 增加了辅助电流源网络实现滞后桥臂ZV
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈