设计一个程序实现两个任意长的整数(包括正数和负数)、任意精度实数的算术运算。

2025-03-12 18:14:20
推荐回答(2个)
回答1:

#include
#include
struct shuzi
{
char number;
shuzi *left;
shuzi *right;
};
void chushi(shuzi *&,int &,int &);
void jiafa(shuzi *,shuzi *);
void jianfa(shuzi *,shuzi *);
void shuchu(shuzi *,int);
void main()
{
char fuhao;
int a,b,n;
int c1,c2,c3;
shuzi *head1,*head2,*t,*p,*q;
cout<<"请按每3位1组,组间用逗号隔开的方式输入两个长整数,每输入完一个请按回车表示输入完毕:"< chushi(head1,a,c1);
chushi(head2,b,c2);
cout< cin>>fuhao;
cout<<"运行的结果是:"< switch (fuhao)
{
case'+':c3=0;break;
case'-':c3=1;break;
default:cout<<"error"< }
c2=c2+c3;
if (c2==2)
c2=0;
if (b>a)
{
t=head1;
head1=head2;
head2=t;
n=a;
a=b;
b=n;
n=c1;
c1=c2;
c2=n;
}
while (a>b)
{
t=new shuzi;
t->number='0';
t->left=NULL;
t->right=head2;
head2->left=t;
head2=t;
b=b+1;
}
if (c1==0 && c2==0)
jiafa(head1,head2);
else
if (c1==1 && c2==1)
{
cout<<"-";
jiafa(head1,head2);
}
else
{
if (a==b)
{
p=head1;
q=head2;
while (p->number==q->number && p->right!=NULL)
{
p=p->right;
q=q->right;
}
if (p->number==q->number)
{
cout<<"0"< return;
}
if (q->number>p->number)
{
t=head1;
head1=head2;
head2=t;
n=c1;
c1=c2;
c2=n;
}
}
if (c1==1)
cout<<"-";
jianfa(head1,head2);
}
shuchu(head1,a+1);
}
void chushi(shuzi *& head,int & n,int & m)
{
char c;
shuzi *s,*p;
n=0;
s=new shuzi;
c=getchar();
head=NULL;
if (c=='-')
{
m=1;
c=getchar();
}
else m=0;
while (c!='\n')
{
if (c==',')
{
c=getchar();
continue;
}
s->number=c;
if (head==NULL)
{
head=s;
head->left=NULL;
head->right=NULL;
p=head;
}
else
{
s->left=p;
s->right=NULL;
p->right=s;
p=s;
}
n=n+1;
s=new shuzi;
c=getchar();
}
delete s;
p=new shuzi;
p->number='0';
p->left=NULL;
p->right=head;
head->left=p;
head=p;
}
void shuchu(shuzi *head,int a)
{
shuzi *s;
s=head;
while (s->number=='0' && s->right!=NULL)
{
s=s->right;
a=a-1;
}
if (s->number=='0')
{
cout<<"0"< return;
}
while (s->right!=NULL)
{
cout<number;
a=a-1;
if (a%3==0 && a!=0) cout<<',';
s=s->right;
}
cout<number;
cout<}
void jiafa(shuzi *head1,shuzi *head2)
{
shuzi *p,*q;
int a,b,m,t;
p=head1;
q=head2;
while (p->right!=NULL)
p=p->right;
while (q->right!=NULL)
q=q->right;
m=0;
do
{
a=p->number-'0';
b=q->number-'0';
t=a+b+m;
m=t/10;
t=t%10;
p->number='0'+t;
p=p->left;
q=q->left;
}while (q!=NULL);
}
void jianfa(shuzi *head1,shuzi *head2)
{
shuzi *p,*q;
int a,b,t,m;
p=head1;
q=head2;
while (p->right!=NULL)
p=p->right;
while (q->right!=NULL)
q=q->right;
m=0;
do
{
a=p->number-'0';
b=q->number-'0';
t=a-b+m;
if (t<0 && p->left!=NULL)
{
m=-1;
t=t+10;
}
else m=0;
p->number='0'+t;
p=p->left;
q=q->left;
}while (q!=NULL);
}

回答2:

我觉得是这样,
链表可以这样设计 [C/C++]:
struct value
{
int flag;
int value;
struct value *next;
}
flag表示标志位,可能的标志有:
enum
{
FLAG_FUHAO,
FLAG_DIGITAL,
FLAG_DOT
}
分别表示符号位,数字位和小数点位。
每次读入一个符号、数字或者小数点,就创建一个新节点并挂在当前链表的末尾。
value那项只有flag是flag_digital时有效,存入一个0~9的数值。
比如读入-12345.54321的话,你的链表就有12个节点,首节点是一个负号,接下来是1,2,3,4,5,然后是小数点标志,然后是5,4,3,2,1。
这样,存储的问题就解决了。

实际运算的时候,先遍历链表,找到小数点位,没有小数点的话,表示整个数据为整数。
小数点前面的m个节点是整数部分,小数点后面的n个节点是小数部分。
然后你需要从两条链表(参与运算的两个数)的小数点位开始,按照数学需要按对应位置,也就是链表的不同对应节点去计算,结果保存在一个新的链表里。当然,新链表需要有插入操作,呵呵。
大概就是这样,还有问题,欢迎继续咨询。