求一个用C++写的大整数四则运算的的程序,包括加减乘除四个运算,要求是运行完成后有加减乘除4个选择,选择一个运算方式后输入2个大整数,然后计算,调试成功之后悬赏加倍
来源:学生作业帮助网 编辑:六六作业网 时间:2024/11/08 09:29:32
求一个用C++写的大整数四则运算的的程序,包括加减乘除四个运算,要求是运行完成后有加减乘除4个选择,选择一个运算方式后输入2个大整数,然后计算,调试成功之后悬赏加倍
求一个用C++写的大整数四则运算的的程序,包括加减乘除四个运算,要求是运行完成后有加减乘除4个选择,选择一个运算方式后输入2个大整数,然后计算,调试成功之后悬赏加倍
求一个用C++写的大整数四则运算的的程序,包括加减乘除四个运算,要求是运行完成后有加减乘除4个选择,选择一个运算方式后输入2个大整数,然后计算,调试成功之后悬赏加倍
#include
#include
#include
#define LEN sizeof(struct long_int)//定义结点大小
//定义双向链表存储结构
struct long_int
{
int data;\x09\x09
int over;\x09\x09
struct long_int *pro;//前驱指针
struct long_int *next;//后继指针
};
//创建带有头结点的空链表
struct long_int *creat()
{
struct long_int *head;
head=(struct long_int *)malloc(LEN);//为头结点分配空间
if(head==NULL)
printf("malloc error!\n");//分配失败
else
{
head->data=0;
head->over=0;
head->pro=head;//将头结点与自身首尾相连构成双向循环链表
head->next=head;
}
return(head);//返回头指针
}
//打印输出函数
void print(struct long_int *head)
{
struct long_int *p;
p=head;
if(head->next==head)
printf("longint error!\n");
else
{
if(head->data==-1)//判断是否为负数,若是则输出-号
printf("-");
p=head->next;
printf("%d",p->data);//输出最高位结点数据
p=p->next;
while(p!=head)//判断各个节点data值的位数来判断先输出几个0
{
if(p->data>=0&&p->datadata);
if(p->data>=10&&p->datadata);
if(p->data>=100&&p->datadata);
if(p->data>=1000)
printf("%d",p->data);
p=p->next;
\x09\x09}
printf("\n");
\x09}
}
//插入结点函数
void insert(struct long_int *head,struct long_int *p)//将新结点插到头结点后
{
p->next=head->next;
head->next->pro=p;
head->next=p;
p->pro=head;
head->over=head->over+1;
}
//删除结点函数
void del(struct long_int *head,struct long_int *p) //删除头结点后的结点
{
head->next=p->next;
p->next->pro=head;
free(p);
head->over=head->over-1;
}
//长整数格式转换函数
struct long_int *get(char s[])
{
struct long_int *head,*q;
int i,j,l=0;
head=creat();
if(s[0]>'0')//判断长整数的符号,并将信息存到头结点中
head->data=1;
if(s[0]=='0')
head->data=0;
if(s[0]=='-')
{
l=1;
head->data=-1;
}
j=strlen(s)-1;
for(i=l;i=3)//从低位到高位,每四位数字为一组存储到链表中
{
q=(struct long_int *)malloc (LEN);
q->data=s[j]+s[j-1]*10+s[j-2]*100+s[j-3]*1000;
insert(head,q);
j=j-4;
}
if(j>=l)//当最后几位数的位数不足四位时,还要单独插入一个结点
{
q=(struct long_int *)malloc(LEN);
q->data=0;
while(ldata=q->data*10+s[l];
l++;
}
insert(head,q);
}
return(head);
}
//长整数加法运算函数
void plus(struct long_int *a,struct long_int *b)
{
struct long_int *m,*n,*p,*chead,*q;
if(a->over==0||b->over==0)
printf("long int error!\n");
else
{
m=a->pro;
n=b->pro;
chead=creat();//创建一个新链表用于存放运算结果
while(m!=a&&n!=b)
{
p=(struct long_int *)malloc(LEN);
p->data=a->data*m->data+b->data*n->data;//最低位相加
insert(chead,p);//将计算结果存储在在chead中
m=m->pro;
n=n->pro;
}
while(m!=a||n!=b)
{
if(m==a)//当b长度大于a时,将b中其余高位数字存入链表
{
p=(struct long_int *)malloc(LEN);
p->data=b->data*n->data;
n=n->pro;
insert(chead,p);
}
else
\x09\x09 if(n==b)//当a长度大于b时,将a中其余高位数字存入链表
{
p=(struct long_int *)malloc(LEN);
p->data=a->data*m->data;
m=m->pro;
insert(chead,p);
}
}
p=chead->next;
chead->data=0;
while(p!=chead)//确定结果的正负
{
if(p->data>0)
{
chead->data=1;
break;
}
if(p->datadata=-1;
break;
}
p=p->next;//如果所有结点值均为0,则结果0
}
p=chead->pro;
while(p!=chead)
{
if(p->next!=chead)
p->data=p->data*chead->data+p->next->over;
if(p->next==chead)//确定位于最低位结点的值
p->data=p->data*chead->data;
p->over=0;
if(p->data>=10000)//如果结点数据值大于等于10000,则有进位
p->over=1;
if(p->dataover=-1;
p->data=p->data-p->over*10000;
p=p->pro;
}
p=chead->next;
while(p->data==0&&p->over==0&&p->next!=chead)
{//去掉最高有效位(非0)之前的0
q=p;
p=p->next;
del(chead,q);
}
if(p->over>0)//如9999+1后给结点值为0,但over为1
{
q=(struct long_int*)malloc(LEN);
q->data=p->over;
insert(chead,q);
}
\x09}
if(chead->next->data==0)
chead->data=0;
print(chead);
}
//长整数减法运算函数
void minus(struct long_int *a,struct long_int *b)
{//减法运算技巧:将减数换符号,做加法
b->data=(-1)*b->data;
plus(a,b);
}
//程序主函数
void main()
{
struct long_int *a,*b;
char s1[100],s2[100];
int n;
printf(" \n");
printf("第1个操作数: ");
gets(s1);
printf("\n第2个操作数:");
gets(s2);
a=get(s1);
b=get(s2);
printf("\n选择运算:\n 1.加法运算\n 2.减法运算\n ");
scanf("%d",&n);
if(n==1)
plus(a,b);
if(n==2)
minus(a,b);
}