请设计一个算法来完成两个超长正整数的加法。
*问题分析与算法设计
首先要设计一种数据结构来表示一个超长的正整数,然后才能够设计算法。
首先我们采用一个带有表头结点的环形链来表示一个非负的超大整数,如果从低位开始为每 个数字编号,则第一位到第四位、第五位到第八位...的每四位组成的数字,依次放在链表的第一个、第二个、...结点中,不足4位的最高位存放在链表的最后一个结点中,表头结点的值规定为-1。例如:
大整数“587890987654321”可用如下的带表头结点head的链表表示:
按照此数据结构,可以从两个表头结点开始,顺序依次对应相加,求出所需要的进位后代入下面的运算。具体的实现算法请见程序中的注释。
*程序说明与注释
- #include<stdio.h>
-
- #include<stdlib.h>
-
- #define HUNTHOU 10000
-
- typedef struct node{ int data;
-
- struct node *next;
-
- }NODE;
-
- NODE *insert_after(NODE *u,int num);
-
- NODE *addint(NODE *p,NODE *q);
-
- void printint(NODE *s);
-
- NODE *inputint(void);
-
- int main()
-
- {
-
- NODE *s1,*s2,*s;
-
- NODE *inputint(), *addint(), *insert_after();
-
- printf("Enter S1= ");
-
- s1=inputint();
-
- printf("Enter S2= ");
-
- s2=inputint();
-
- printf(" S1="); printint(s1); putchar('\n');
-
- printf(" S2="); printint(s2); putchar('\n');
-
- s=addint(s1,s2);
-
- printf("S1+S2="); printint(s); putchar('\n');
-
- }
-
- NODE *insert_after(NODE *u,int num)
-
- {
-
- NODE *v;
-
- v=(NODE *)malloc(sizeof(NODE));
-
- v->data=num;
-
- u->next=v;
-
- return v;
-
- }
-
- NODE *addint(NODE *p,NODE *q)
-
- {
-
- NODE *pp,*qq,*r,*s,*t;
-
- int total,number,carry;
-
- pp=p->next; qq=q->next;
-
- s=(NODE *)malloc(sizeof(NODE));
-
- s->data=-1;
-
- t=s; carry=0;
-
- while(pp->data!=-1&&qq->data!=-1)
-
- {
-
- total=pp->data+qq->data+carry;
-
- number=total%HUNTHOU;
-
- carry=total/HUNTHOU;
-
- t=insert_after(t,number);
-
- pp=pp->next;
-
- qq=qq->next;
-
- }
-
- r=(pp->data!=-1)?pp:qq;
-
- while(r->data!=-1)
-
- {
-
- total=r->data+carry;
-
- number=total%HUNTHOU;
-
- carry=total/HUNTHOU;
-
- t=insert_after(t,number);
-
- r=r->next;
-
- }
-
- if(carry) t=insert_after(t,1);
-
- t->next=s;
-
- return s;
-
- }
-
- NODE *inputint(void)
-
- {
-
- NODE *s,*ps,*qs;
-
- struct number {int num;
-
- struct number *np;
-
- }*p,*q;
-
- int i,j,k;
-
- long sum;
-
- char c;
-
- p=NULL;
-
- while((c=getchar())!='\n')
-
- if(c>='0'&&c<='9')
-
- {
-
- q=(struct number *)malloc(sizeof(struct number));
-
- q->num=c-'0';
-
- q->np=p;
-
- p=q;
-
- }
-
- s=(NODE *)malloc(sizeof(NODE));
-
- s->data=-1;
-
- ps=s;
-
- while(p!=NULL)
-
- {
-
- sum=0;i=0;k=1;
-
- while(i<4&&p!=NULL)
-
- {
-
- sum=sum+k*(p->num);
-
- i++; p=p->np; k=k*10;
-
- }
-
- qs=(NODE *)malloc(sizeof(NODE));
-
- qs->data=sum;
-
- ps->next=qs;
-
- ps=qs;
-
- }
-
- ps->next=s;
-
- return s;
-
- }
-
- void printint(NODE *s)
-
- {
-
- if(s->next->data!=-1)
-
- {
-
- printint(s->next);
-
- if(s->next->next->data==-1)
-
- printf("%d",s->next->data);
-
- else{
-
- int i,k=HUNTHOU;
-
- for(i=1;i<=4;i++,k/=10)
-
- putchar('0'+s->next->data%(k)/(k/10));
-
- }
-
- }
-
- }
-
(责任编辑:admin) |