c语言写的长整数加法

sordider 2015-07-01 02:33:29
这是c语言写的长整数加法运算,学c不久,最近在看c语言的一些经典算法,能否帮忙注释一下,尽量详细些,另外typedef struct DuLNode与直接定义typedef struct的差异是什么,以及长整数与大整数是否是相同的还是有差异,着实有些糊涂
#include <stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>

int length1,length2;
char num1[100],num2[100];
int n1,n2,daxiao;

typedef struct DuLNode{
int data;
int carry;
struct DuLNode *prior;
struct DuLNode *next;
}NuLNode, *DuLinkList;

typedef struct{
char fuhao;
DuLNode *Top;
}LinkTop,*LinkList;


void AddList_L(LinkList L1,LinkList L2,LinkList &L3);
int SubList_L(LinkList L1,LinkList L2,LinkList &L3);
void ShowList(LinkList L);


int CreatList_L(LinkList &L,char num[],int &n){
L=(LinkList)malloc(sizeof(LinkTop));
DuLinkList p,q;
int temp,length=0;
char a;
int i=0,m=0,sum=0;
int a1=0,a2=0,a3=0,a4=0;
a=getchar();
if (a=='-') L->fuhao='-'; else
{
if (a!='0')
{L->fuhao='+';
num[i++]=a;}
else {
L->fuhao=' ';
num[i++]=a;
}
}
while ((a=getchar())!='\n') {
num[i++]=a;
}
num[i]='\0';
n=i;
if (i>0) a1=num[--i]-'0';
if (i>0) a2=num[--i]-'0';
if (i>0) a3=num[--i]-'0';
if (i>0) a4=num[--i]-'0';
sum=1000*a4+100*a3+10*a2+a1;


p=(DuLinkList)malloc(sizeof(DuLNode));
p->data=sum;
p->next = NULL;
p->prior = NULL;
L->Top=p;
q=p;
++length;
if (i%4!=0) m=i/4+1;
else m=i/4;
for(int k=0;k<m;k++){
int sum=0;
a1=0;
a2=0;
a3=0;
a4=0;
if (i>0) a1=num[--i]-'0';
if (i>0) a2=num[--i]-'0';
if (i>0) a3=num[--i]-'0';
if (i>0) a4=num[--i]-'0';
sum=1000*a4+100*a3+10*a2+a1;


p=(DuLinkList)malloc(sizeof(DuLNode));
p->next = NULL;
p->data=sum;
q->next=p;
p->prior=q;
q=p;
++length;
}
return length;
}


int main()
{

LinkList L1,L2,L3;
DuLinkList p;
int i=0;


printf("请输入两个长整数 \n");
length1=CreatList_L(L1,num1,n1);
length2=CreatList_L(L2,num2,n2);
printf("在链表中的形式是:") ;
ShowList(L1);
printf(" 和 ");
ShowList(L2);
printf("\n");
printf("运算结果是:");

if ((L1->fuhao=='+' && L2->fuhao=='+') ||(L1->fuhao=='-' && L2->fuhao=='-'))
AddList_L(L1,L2,L3);
else
SubList_L(L1,L2,L3);
ShowList(L3);

printf("按任意键结束 ");
getchar();




return 0;
}


void ShowList(LinkList L)
{

DuLinkList topNode = L->Top;
DuLinkList p = topNode,r;
printf("%c",L->fuhao);
while(p->next!=NULL) p=p->next;
while ((p->data==0) && (p->prior!=NULL))
{
p=p->prior;


}
while(p!=NULL)
{
printf("%04d,",p->data);
p=p->prior;
}
}

void AddList_L(LinkList L1,LinkList L2,LinkList &L3){
if (length1>=length2)
L3=L1;
else
L3=L2;
DuLinkList p,q,h,j;
DuLinkList hPrev = NULL;
int car;
p=L1->Top;
q=L2->Top;
h=L3->Top;
h->carry=0;
car = 0;

while(p && q)
{
h->carry = car;
h->data=((p->data)+(q->data)+(h->carry));
if((h->data) >=10000)
{

car=1;
h->data=(h->data)%10000;
}
else
{

car=0;
}
hPrev = h;
h=h->next;
p=p->next;
q=q->next;
}
if(!h){
j=(DuLinkList)malloc(sizeof(DuLNode));

j->data = 0;
j->next = NULL;
hPrev->next = j;
j->prior = hPrev;
h=j;
h->carry=car;
}

h->carry =car;
h->data=(h->data)+(h->carry);
}

int SubList_L(LinkList L1,LinkList L2,LinkList &L3){
LinkList Ltemp;
DuLinkList k;
int a=0;
L3=(LinkList)malloc(sizeof(LinkTop));
//L3为L1,L2中较大者,当两者一样大是,L3新建结点,data为零
if (n1>n2)
{
L3=L1;
a=1;
}
if (n1<n2)
{
L3=L2;
Ltemp=L1;
L1=L2;
L2=Ltemp;
a=1;
}
/* if(strcmp(num1,num2)==0)
{
L3=(LinkList)malloc(sizeof(LinkTop));
k->data=0;
L3->Top=k;
L3->fuhao=' ';
k->next = NULL;
k->prior = NULL;
return 0;
} */
if(n1==n2){
for(int i=0;i<n1;i++)
{
if(num1[i]>num2[i])
{
L3=L1;
a=1;
break;
}
if(num1[i]<num2[i])
{
L3=L2;
Ltemp=L1;
L1=L2;
L2=Ltemp;
a=1;
break;

}
}
if (a==0) {
k=(DuLinkList)malloc(sizeof(DuLNode));
k->data=0;
L3->Top=k;
L3->fuhao=' ';
k->next = NULL;
k->prior = NULL;
return 0;
}
}


k=(DuLinkList)malloc(sizeof(DuLNode));



DuLinkList p,q,h,j;
int car;

p=L1->Top;
q=L2->Top;
h=L3->Top;
h->carry=0;
car=0;

while ((p) && (q)){
h->carry = car;
h->data=(p->data)-(q->data)-(h->carry);

if((h->data) <0){

car=1;
h->data=(h->data)+10000;
}
else car=0;
h=h->next;
p=p->next;
q=q->next;
}
if (car==1)
h->carry=car;
if(h) {
h->data=(h->data)-(h->carry);
if(h->data<0){
car=1;
h->data=(h->data)+10000;
h=h->next;
h->carry=car;
h->data=(h->data)-(h->carry);
}
}
return 0;
}





...全文
243 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-07-01
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char a1[MAXLEN];
char a2[MAXLEN];
static int v1[MAXLEN];
static int v2[MAXLEN];
static int v3[MAXLEN];
int i,j,n,L,z;
void main(void) {
    scanf("%d",&n);
    for (j=0;j<n;j++) {
        scanf("%s%s",a1,a2);

        L=strlen(a1);
        for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';

        L=strlen(a2);
        for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';

        for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];

        for (i=0;i<MAXLEN;i++) {
            if (v3[i]>=10) {
                v3[i+1]+=v3[i]/10;
                v3[i]=v3[i]%10;
            }
        }

        printf("Case %d:\n", j+1);
        printf("%s + %s = ", a1, a2);

        z=0;
        for (i=MAXLEN-1;i>=0;i--) {
            if (z==0) {
                if (v3[i]!=0) {
                    printf("%d",v3[i]);
                    z=1;
                }
            } else {
                printf("%d",v3[i]);
            }
        }
        if (z==0) printf("0");

        printf("\n");
    }
}
//Sample Input
//3
//0 0
//1 2
//112233445566778899 998877665544332211
//
//Sample Output
//Case 1:
//0 + 0 = 0
//Case 2:
//1 + 2 = 3
//Case 3:
//112233445566778899 + 998877665544332211 = 1111111111111111110

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧