c++实现任意长整数的四则运算Word文档格式.docx
《c++实现任意长整数的四则运算Word文档格式.docx》由会员分享,可在线阅读,更多相关《c++实现任意长整数的四则运算Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
所以采用链式存储方式。
而且任意长数据通过字符串输入。
在链表的每一个结点中,数据域是在该数位上的数字大小。
2.主要功能模块的功能
◆任意长整数的输入
◆任意长整数的标准化输出
◆两个整数的加法
◆两个整数的乘法
三.详细设计(主模块流程图)
5、使用说明及测试结果
1.使用说明:
点击打开应用程序pro1.exe。
依次输入任意两个整数(例如123456,+1234567),按回车,会出现菜单,如下图:
按‘1’则实现两整数的加法
按‘2’则实现两整数的乘法
按‘#’结束
注:
菜单可重复出现直至‘#’退出。
实现加法,乘法如下图:
2.测试结果:
(1)123456
(2)+1234567
(3)-987654321
(4)12a3
(5)+
当输入错误时,允许重新输入。
6、源程序
/*主函数*/
/***************************************************/
#include"
cal.h"
voidmain(){
strings;
stringp;
DblListlist1;
while
(1){//输入错误时,允许重新输入
cout<
<
"
Inputnum1"
endl;
cin>
>
s;
boolok1=list1.CreatList(s);
if(!
ok1)
{
cout<
error!
}
else{
num1:
;
list1.Display();
break;
}
DblListlist2;
while
(1){
Inputnum2:
p;
boolok2=list2.CreatList(p);
ok2)
num2:
list2.Display();
stringchoose;
while
(1)
{
请选择运算法:
--------------------------"
/*菜单*/
|1.num1+num2|"
/*可以重复输入运算符,按'
#'
退出*/
|2.num1*num2|"
|#.exit|"
while
(1)
{
cin>
choose;
if(choose=="
1"
)
{
list1+list2;
break;
}
elseif(choose=="
2"
list1*list2;
elseif(choose=="
#"
return;
else
输入有误,请重新输入!
!
continue;
}
/*头文件,包括长整数数据结构的定义,成员函数的定义*/
/***********************************************************/
#include<
iostream>
string>
cmath>
usingnamespacestd;
structDblNode{
intdata;
DblNode*prior;
DblNode*next;
boolIsNum(chara){//判断字符a是否是便是数字
ints=a-'
0'
if(s>
=0&
&
s<
10)returntrue;
elsereturnfalse;
boolIsInt(stringa){//判断字符串a是否表达一串数字
boolJud=1;
inti=1;
chars=a[0];
if(a=="
+"
||a=="
-"
)returnfalse;
if(s=='
+'
||s=='
-'
){}
elseif(s>
='
1'
9'
){}
elseif(a[0]=='
a[1]=='
\0'
)returntrue;
while(a[i]!
{
Jud=IsNum(a[i]);
if(Jud==0)returnfalse;
i++;
returntrue;
intJudSign(strings){//返回数字的符号
if(s[0]=='
)return-1;
elseif(s[0]=='
s[1]=='
)return0;
elsereturn1;
intCtoI(chara){
inti=a-'
returni;
classDblList{//定义一个双向链表类,存储任意长度的数字
//并可以进行标准化输出和加法,乘法。
//生成一个双向链表
//从表头插入一个结点
voidDisplay();
DblList:
:
DblList(){
head=newDblNode();
head->
next=NULL;
prior=NULL;
tail=head;
current=NULL;
sign=0;
~DblList(){//析构函数
while(head->
next!
=NULL)
current=head->
next;
head->
next=current->
deletecurrent;
deletehead;
head=NULL;
tail=NULL;
intDblList:
GetCount(){//返回该数字的长度(不包括符号位)
intcount=0;
while(current)
count++;
current=current->
returncount;
voidDblList:
Insert(DblNode*p){//从链表尾部插入一个结点
tail->
next=p;
p->
prior=tail;
tail=p;
InsertFront(DblNode*q){//从链表头部插入一个结点
if(head->
next==NULL)
next=q;
q->
prior=head;
tail=q;
else{
next=head->
next->
prior=q;
boolDblList:
CreatList(strings){//输入的任意长度的表示数字的字符串
boolj=IsInt(s);
//以此生成双向链表
if(!
j)returnj;
inti=0;
sign=JudSign(s);
if(s[0]=='
||s[0]=='
)i++;
while(s[i]!
intia=CtoI(s[i]);
current=newDblNode();
current->
data=ia;
current->
Insert(current);
i++;
current=NULL;
returntrue;
Clear(){
next)
Compare(DblList&
s){//任意两个长度数字绝对值比较
inta=GetCount();
intb=s.GetCount();
if(a>
b)return1;
elseif(a<
b)return-1;
else
s.current=s.head->
while(current!
intre=current->
data-s.current->
data;
if(re>
0)return1;
elseif(re<
0)return-1;
else
current=current->
s.current=s.current->
current=NULL;
s.current=NULL;
return0;
DblList&
DblList:
operator=(DblList&
s){
Clear();
sign=s.sign;
s.current=s.head->
while(s.current!
current=newDblNode();
current->
data=s.current->
Insert(current);
s.current=s.current->
s.current=NULL;
return*this;
operator+(DblList&
s){//实现加法(包括减法)
DblListtemp;
intda;
intf=0;
intsi=Compare(s);
if(si==0&
(sign+s.sign==0))temp.sign=0;
if(si==0)temp.sign=sign;
elseif(si>
0)temp.sign=sign;
elsetemp.sign=s.sign;
current=tail;
s.current=s.tail;
if(current==head&
s.current==s.head)
if(f)
{
da=f;
temp.current=newDblNode();
temp.current->
data=f;
temp.InsertFront(temp.current);
}
if(!
f)break;
f=0;
elseif(current!
=head&
s.current==s.head)
temp.current->
data=current->
data+f;
temp.InsertFront(temp.current);
prior;
elseif(current==head&
s.current!
=s.head)
s.current=s.current->
da=current->
data*sign+s.current->
data*s.sign+f;
if(da*temp.sign>
=10)
da=da-10*temp.sign;
f=temp.sign;
elseif(da*temp.sign<
0)
da=da+10*temp.sign;
f=-temp.sign;
elsef=0;
temp.current=newDblNode();
data=abs(da);
temp.current=temp.head->
if(temp.current!
while(temp.current->
data==0)
temp.head->
next=temp.current->
deletetemp.current;
temp.current=temp.head->
temp.current=NULL;
cout<
num1+num2="
temp.Display();
operator*(DblList&
s){//实现乘法
intcf=0;
intans;
inti,j;
temp.sign=sign*s.sign;
inta1=GetCount();
inta2=s.GetCount();
inta=a1+a2;
for(i=0;
i<
a;
i++)
temp.current=newDblNode();
temp.current->
data=0;
temp.InsertFront(temp.current);
s.current=s.tail;
=s.head){
current=tail;
temp.current=temp.tail;
for(i=0;
count;
i++)temp.current=temp.current->
for(j=0;
j<
a1;
j++){
ans=s.current->
data*current->
data+temp.current->
data+cf;
data=ans%10;
cf=ans/10;
current=current->
temp.current=temp.current->
if(cf!
=0)
data=temp.current->
cf=0;
if(temp.head->
temp.current=NULL;
}
num1*num2="
Display(){//任意长数字的标准化输出
intcount=GetCount();
if(sign==0)
0"
return;
elseif(sign==-1)cout<
while(current!
{
if(count>
0){
current->
count--;
if(count%3==0&
count!
=0)cout<
"
--------------------------------------------------------------"