求一个用C++写的大整数四则运算的的程序,包括加减乘除四个运算,要求是运行完成后有加减乘除4个选择,选择一个运算方式后输入2个大整数,然后计算,调试成功之后悬赏加倍
来源:学生作业帮助网 编辑:作业帮 时间:2024/06/25 12:02:55
![求一个用C++写的大整数四则运算的的程序,包括加减乘除四个运算,要求是运行完成后有加减乘除4个选择,选择一个运算方式后输入2个大整数,然后计算,调试成功之后悬赏加倍](/uploads/image/z/11455197-69-7.jpg?t=%E6%B1%82%E4%B8%80%E4%B8%AA%E7%94%A8C%2B%2B%E5%86%99%E7%9A%84%E5%A4%A7%E6%95%B4%E6%95%B0%E5%9B%9B%E5%88%99%E8%BF%90%E7%AE%97%E7%9A%84%E7%9A%84%E7%A8%8B%E5%BA%8F%2C%E5%8C%85%E6%8B%AC%E5%8A%A0%E5%87%8F%E4%B9%98%E9%99%A4%E5%9B%9B%E4%B8%AA%E8%BF%90%E7%AE%97%2C%E8%A6%81%E6%B1%82%E6%98%AF%E8%BF%90%E8%A1%8C%E5%AE%8C%E6%88%90%E5%90%8E%E6%9C%89%E5%8A%A0%E5%87%8F%E4%B9%98%E9%99%A44%E4%B8%AA%E9%80%89%E6%8B%A9%2C%E9%80%89%E6%8B%A9%E4%B8%80%E4%B8%AA%E8%BF%90%E7%AE%97%E6%96%B9%E5%BC%8F%E5%90%8E%E8%BE%93%E5%85%A52%E4%B8%AA%E5%A4%A7%E6%95%B4%E6%95%B0%2C%E7%84%B6%E5%90%8E%E8%AE%A1%E7%AE%97%2C%E8%B0%83%E8%AF%95%E6%88%90%E5%8A%9F%E4%B9%8B%E5%90%8E%E6%82%AC%E8%B5%8F%E5%8A%A0%E5%80%8D)
求一个用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);
}