求一个用C++写的大整数四则运算的的程序

求一个用C++写的大整数四则运算的的程序,包括加减乘除四个运算,要求是运行完成后有加减乘除4个选择,选择一个运算方式后输入2个大整数,然后计算,调试成功之后悬赏加倍时间不... 求一个用C++写的大整数四则运算的的程序,包括加减乘除四个运算,要求是运行完成后有加减乘除4个选择,选择一个运算方式后输入2个大整数,然后计算,调试成功之后悬赏加倍
时间不多了,帮帮忙大神们.请发到我的邮箱1224717432@qq。com
展开
 我来答
斐斐若水
2011-07-04 · TA获得超过2825个赞
知道答主
回答量:188
采纳率:0%
帮助的人:138万
展开全部
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define LEN sizeof(struct long_int)//定义结点大小
//定义双向链表存储结构
struct long_int
{
int data;
int over;
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->data<10)
printf("000%d",p->data);
if(p->data>=10&&p->data<100)
printf("00%d",p->data);
if(p->data>=100&&p->data<1000)
printf("0%d",p->data);
if(p->data>=1000)
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
}

//插入结点函数
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<=j;i++)//将字符串的每一位字符对应的ASCII码转换为十进制数
s[i]=s[i]-'0';
while(j-l>=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(l<=j)
{
q->data=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
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->data<0)
{
chead->data=-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->data<0)//如果结点数据值小于0,则有借位
p->over=-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);
}
}
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 长整数加减运算: \n ****************** \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);
}
追问
再加个乘法和除法的好吗     谢谢了    完事悬赏加倍加倍加倍都给你
追答
给楼主一个网址,这上边的功能比较齐全
http://blog.sina.com.cn/s/blog_49ed05e601000bav.html
我的代码是读书的时候拼的,现在都有点忘了,不好意思
往往0806
2011-07-05
知道答主
回答量:8
采纳率:0%
帮助的人:0
展开全部
用字符数组啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
凸拷炯Cj
2011-06-30 · TA获得超过244个赞
知道答主
回答量:120
采纳率:0%
帮助的人:28.1万
展开全部
这种问题很简单啊,你找谭浩强的书一看就知道了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
想念式の心随
2011-06-30
知道答主
回答量:69
采纳率:0%
帮助的人:0
展开全部
C++LIABVAIVNEJRGVG=VIARBBEUIRBVERB++ljkfGHFR
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式