qq_35323645 2016-12-29 05:11 采纳率: 0%
浏览 2892

求两个任意长的整数加法

问题描述:设计一个程序实现两个任意长的整数的求和运算。
要求:
利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。要求输入和输出每四位一组,组间用逗号隔开。如:1,0000,0000,0000,0000。
#include
#include
typedef struct Node{
int data;
struct Node *prior;
struct Node *next;
}LNode,*LinkList;
void InitLink(LinkList *L)
{
*L=(LinkList)malloc(sizeof(LNode));
(*L)->prior=*L;
(*L)->next=*L;
}
void Delete(LinkList L)
{
LinkList p=L->next;
LinkList temp;
while(p!=L)
{
temp=p;
p->next;
free(temp);
}
L->next=L;
L->prior=L;
}
void Append(LinkList L,int s)
{
LinkList p=L;
LinkList temp=(LinkList)malloc(sizeof(LNode));
temp->next=L;
temp->data=s;
temp->prior=L->prior;
L->prior->next=temp;
L->prior=temp;
}
void Output(LinkList L)
{
LinkList p=L->next;
if(p==L)
{
printf("0");
return;
}
if(L->data==-1)
printf("-");
printf("%d",p->data);
p=p->next;
while(p!=L)
{
printf(",%04d",p->data);
p=p->next;
}
}
void Output2(LinkList L)
{
LinkList p=L->prior;
if(p==L)
{
printf("0");
return;
}
if(L->data==-1)
printf("-");
printf("%d",p->data);
p=p->prior;
while(p!=L)
{
printf(",%04d",p->data);
p=p->prior;
}
}
void Sum_Linksum(LinkList A,LinkList B,LinkList C)
{
LinkList a=A->prior;
LinkList b=B->prior;
int sum;
int carry=0;
C->data=1;
if(A->data C->data=-1;
while(a!=A&&b!=B)
{
sum=a->data+b->data+carry;
carry=sum/10000;
Append(C,sum%10000);
a=a->prior;
b=b->prior;
}
while(a!=A)
{
sum=a->data+carry;
carry=sum/10000;
Append(C,sum%10000);
a=a->prior;
}
while(b!=B)
{
sum=b->data+carry;
carry=sum/10000;
Append(C,sum%10000);
b=b->prior;
}
if(carry)Append(C,carry);
}
void DelZero(LinkList L)
{
LinkList p=L;
LinkList q;
while(p->prior!=L)
{
if(p->prior->data!=0)
break;
else
{
q=p->prior;
p->prior=q->prior;
q->prior->next=p;
free(q);
}
}

}
void Sub_Linknum(LinkList A,LinkList B,LinkList C)
{
LinkList HA=A;
LinkList HB=B;
LinkList a=HA->prior;
LinkList b=HB->prior;
int sub;
int borrow=0;
int flag=0;
C->data=1;
while(a!=HA&&b!=HB)
{
if(a->datadata) flag=1;
if(a->data>b->data) flag=0;
a=a->prior;
b=b->prior;
}
if(b!=HB) flag=1;
if(a!=HA) flag=0;
if(flag==1)
{
HA=B;
HB=a;
C->data=-1;
}
a=HA->prior;
b=HB->prior;
while(b!=HB){
sub=a->data-borrow-b->data;
if(sub>=0)
borrow=0;
else
{
borrow=1;
sub+=10000;
}
Append(C,sub);
a=a->prior;
b=b->prior;
}
while(a!=HA){
sub=a->data-borrow;
if(sub>=0)
borrow=0;
else
{
borrow=1;
sub+=10000;
}
Append(C,sub);
a=a->prior;
}
DelZero(C);
}
int main()
{
freopen("in.txt",stdin);
freopen("out.txt",stdout);
int i,k;
int dex=0,flag=0;
char ch;
LinnkList num[3];
printf("\nplease input Number:\n");
for(i=0;i InitLink(&num[i]);
while(scanf("%d",&k)!=EOF)
{
if(flag==0)
{
if(k {
num[dex]->data=-1;
k*=-1;
}
else if(k>0)
num[dex]->data=1;
else
num[dex]->data=0;
flag=1;
}
ch=getchar();
Append(num[dex],k);
if(ch!=',')
{
if(dex==1)
{
if(num[0]->data==0&&num[1]->data==0)
break;
Output(num[0]);
printf("+");
Output(num[1]);
printf("=");
if(num[0]->data==num[1]->data)
Sum_Linknum(num[0],num[1],num[2]);
else if(num[0]->data>0)
Sub_Linknum(num[0],num[1],num[2]);
else
Sub_Linknum(num[0],num[1],num[2]);
Output(num[2]);
puts("");
for(i=0;i<3;i++)
Delete(num[i]);

}
flag=0;
dex=!dex;
}
}
system("pause");
return 0;
}
这个程序出现了什么问题,为什么编译不出来

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-09 16:18
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100