- //功能:长整数的加减
- #include<stdio.h>
- #include<malloc.h>
- #include<math.h>
- #include<conio.h>
- #define Len sizeof(Long)
- typedef struct LongLong
- {
- long num;//9位
- int side;//位数
- char f;//符合
- struct LongLong *next,*prior;
- }Long;
- int exchang(char a);//将字符转换为int类型
- Long *Add(Long *p,Long *q);//两整形相加,比如:两整型同号我认为是相加
- Long *Sum(Long *p,Long *q);//两整型相减,两整型异号我认为为相减
- void print(Long *p,int i);//输出函数
- Long *sum1(Long *p,Long *q);//位数不相等的减法
- Long *sum2(Long *p,Long *q);//位数相同的减法
- Long *CreatLong(Long *p,char a[100]);//创立一个长整型
- int LongLength(Long *p);//长整型的长度
- void DestroyLong(Long *p);//销毁一个长整型
- bool LongEmpty(Long *p);//判定这个整型是否为0,为0返回1,不是0返回1
- void printLength(Long *p);//输出位数
- bool InJudge(char c[]);//判断是否输入错误
- int main()
- {
- char a[100],b[100],c,d;//c加减符号
- Long *p,*q,*Totol,*p1,*p2;
- printf("请输入长整型p和q的及加减符号:如p+q或p-q\\n");
- //gets(a);
- //printf(" ");
- //gets(b);
- scanf("%s%s",a,b);
- while((!InJudge(b))||(!InJudge(b)))
- {
- printf("输入错误,请重新输入");
- scanf("%s%s",a,b);
- }
- if((b[0]=='-')||(b[0]=='+'))
- {
- c=b[0];
- int i=0;
- while(b[i]!='\\0'&&b[i+1]!='\\0')
- {
- b[i]=b[i+1];
- i++;
- }
- b[i]='\\0';
- }
- else c='+';//printf("a ");
- p=CreatLong(p1,a);
- q=CreatLong(p2,b);
- p->side=LongLength(p);
- q->side=LongLength(q);
- //printLength(p);
- //printLength(q);
- d=q->f;
- {
- if((c=='+'&&q->f=='-')||c=='-'&&q->f=='+')
- q->f='-';
- else q->f='+';
- }
- if((p->f=='-'&&q->f=='-')||(p->f=='+'&&q->f=='+'))
- Totol=Add(p,q);
- else
- Totol=Sum(p,q);
- q->f=d;
- Totol->side=LongLength(Totol);
- print(p,1);
- putchar(c);
- print(q,2);
- printf("=");
- print(Totol,1);
- //printLength(Totol);
- getch();
- return 0;
- }
- Long *CreatLong(Long *p,char a[100])
- {
- Long *head,*p1;
- head=p=(Long*)malloc(Len);
- int a1=0,a2,q,l;
- double a3;
- while(a[a1]!='\\0')
- a1++;
- if(a[0]=='-'||a[0]=='+')
- {
- a3=(float)(--a1)/9;
- head->f='-';
- int q=0;
- while(q<=a1)
- {
- a[q]=a[q+1];
- q++;
- }
- a[q]='\\0';
- }
- else
- {
- a3=(float)a1/9;
- head->f='+';
- }
- head->side=a1;
- head->prior=NULL;
- //printf("%d",a1);
- q=a1/9;
- if(q*9==a1)a2=q;
- else
- a2=(int)ceil(a3);
- l=a2;
- while(a2>0)
- {
- p1=(Long*)malloc(Len);
- p1->num=(long)0;//printf("yufei");
- int q1=0;
- int q2=a1;
- int q4;
- while(q2>0&&q1<9)
- {
- q2--;
- q1++;
- }
- while(q2>=0&&q1>0)
- {
- q4=exchang(a[q2]);
- p1->num=(long)(p1->num*10+q4);
- a1--;
- q2++;
- q1--;
- }
- p->next=p1;
- p1->prior=p;
- p=p1;
- a2--;
- }
- p->next=NULL;
- return head;
- }
- int exchang(char a)//字符转换为数
- {
- int b;
- b=(int)(a-'0');//printf("%d",b);
- return b;
- }
- Long *Add(Long *p,Long *q)
- {
- Long *p1,*head,*p2;//总数放在P1链表中
- int i=0;//进位:1进位,0不进位
- p1=head=(Long*)malloc(Len);
- head->f=p->f;
- head->prior=NULL;
- while((p->next!=NULL&&q->next!=NULL)||i==1)
- {
- p2=(Long*)malloc(Len);
- if(p->next!=NULL&&q->next!=NULL)
- {
- p=p->next;
- q=q->next;
- p2->num=(p->num+q->num+i)%1000000000;
- i=(int)(p->num+q->num+i)/1000000000;
- }
- else if(p->next==NULL&&i==1&&q->next!=NULL)
- {
- q=q->next;
- p2->num=(i+q->num)%1000000000;
- i=(int)(i+q->num)/1000000000;
- }
- else if(q->next==NULL&&i==1&&p->next!=NULL)
- {
- p=p->next;
- p2->num=(i+p->num)%1000000000;
- i=(int)(i+p->num)/1000000000;
- }
- else
- {
- p2->num=i;
- i=0;
- }
- p1->next=p2;
- p2->prior=p1;
- p1=p2;
- }
- while(p->next!=0&&q->next==NULL&&i==0)
- {
- p2=(Long*)malloc(Len);
- p=p->next;
- p2->num=p->num;
- p1->next=p2;
- p2->prior=p1;
- p1=p2;
- }
- while(q->next!=NULL&&p->next==NULL&&i==0)
- {
- p2=(Long*)malloc(Len);
- q=q->next;
- p2->num=q->num;
- p1->next=p2;
- p2->prior=p1;
- p1=p2;
- }
- p1->next=NULL;
- return head;
- }
- Long *Sum(Long *p,Long *q)
- {
- int r=0;
- Long *head;
- if(p->side>q->side)
- head=sum1(p,q);
- else if(q->side>p->side)
- head=sum1(q,p);
- else
- head=sum2(p,q);
- head->prior=NULL;
- return head;
- }
- Long *sum1(Long *p,Long *q)//p的位数大于q的位数
- {
- Long *head,*p1,*p2;//缺陷若1 000 000-999 999 999会出现几个空节点
- int i=0;
- long n;
- head=p1=(Long *)malloc(Len);
- head->f=p->f;
- while(q->next!=NULL)
- {
- p2=(Long*)malloc(Len);
- p=p->next;q=q->next;
- n=p->num-q->num+i;
- if(n>=0){p2->num=n;i=0;}
- else
- {
- p2->num=1000000000+n;
- i=-1;
- }
- p1->next=p2;
- p2->prior=p1;
- p1=p2;
- }
- while((q->next==NULL)&&i==-1)
- {
- p2=(Long*)malloc(Len);
- p=p->next;
- n=p->num+i;
- if(n>=0)
- {
- if(n==0&&p->next==NULL){free(p2);break;}//位数得改变
- p2->num=n;i=0;
- }
- else
- {
- p2->num=1000000000+n;
- i=-1;
- }
- p1->next=p2;
- p2->prior=p1;
- p1=p2;
- }
- while(p->next!=NULL)
- {
- p2=(Long*)malloc(Len);
- p=p->next;
- p2->num=p->num;
- p1->next=p2;
- p2->prior=p1;
- p1=p2;
- }
- p1->next=NULL;
- return head;
- }
- Long *sum2(Long *p,Long *q)
- {
- Long *head,*p1,*p2,*p3,*p4;
- p3=p;p4=q;
- //while(p->next!=NULL)
- int i=0;
- long n;
- head=p1=(Long *)malloc(Len);
- head->f=p->f;
- while(p->next!=NULL&&p->next->next!=NULL)
- {
- p2=(Long*)malloc(Len);
- p=p->next;q=q->next;
- n=p->num-q->num+i;
- if(n>=0){p2->num=n;i=0;}
- else
- {
- p2->num=1000000000+n;
- i=-1;
- }
- p1->next=p2;
- p2->prior=p1;
- p1=p2;
- }
- if(p->next!=NULL&&p->next->next==NULL)
- {
- p2=(Long*)malloc(Len);
- p=p->next;q=q->next;
- n=p->num-q->num+i;
- if(n>=0)
- {p2->num=n;p1->next=p2;
- p2->prior=p1;
- p1=p2;}
- else return sum2(p4,p3);
- }
- p1->next=NULL;
- return head;
- }
- void print(Long *p,int l)
- {
- int i=0,n;
- Long *head=p;
- if((l==1&&p->f=='+')||(l==2&&p->f=='+'));
- else if(l==1&&p->f=='-')
- printf("%c",p->f);
- else printf("(%c",p->f );
- if(p==NULL||p->next==NULL)printf("0");
- while(p->next!=NULL)
- {
- p=p->next;
- i++;
- }
- n=i;
- while(i>0&&p->prior!=NULL)
- {
- if(p->num==0&&i!=n)
- printf("000000000");
- else if(i!=n) printf("%09ld",p->num);
- else printf("%ld",p->num);
- printf(" ");
- p=p->prior;
- i--;
- }
- if(l==2&&head->f=='-')printf(")");
- }
- int LongLength(Long *p)
- {
- Long *q,*head;
- long l;
- int i=0;//位数
- //printLength(p);
- head=p;
- if(p==NULL||p->next==NULL)return false;
- //printLength(p);
- while(p->next!=NULL)
- {
- p=p->next;
- }
- while(p->num==0)
- {
- q=p;
- if(p->prior==NULL)break;
- p=p->prior;
- free(q);
- p->next=NULL;
- }
- l=p->num;
- while(l>0)
- {i++;
- l=(int)l/10;
- }
- //printf("%d",i);
- while(p->prior!=NULL&&p->prior!=head)
- {
- p=p->prior;
- i+=9;
- }
- return i;
- }
- void DestroyLong(Long *p)//销毁一个长整型
- {
- Long *q;
- while(p->next!=NULL)
- {
- q=p;
- p=p->next;
- free(q);
- }
- free(p);
- }
- bool LongEmpty(Long *p)
- {
- if(p==NULL||p->next==NULL)
- return true;
- int i=0;
- while(p->next!=0)
- {
- p=p->next;
- if(p->num!=0){i++;break;}
- }
- if(i==0)return 1;
- else return 0;
- }
- void printLength(Long *p)
- {
- printf("长度为%d ",p->side);
- }
- bool InJudge(char c[])
- {
- int i=0;
- while(c[i]!='\\0')
- {
- if(c[i]>=48&&c[i]<59||c[i]=='+'||c[i]=='-')
- i++;
- else return false;
- }
- return true;
- }
- /*if(p->)
- while(p->next!=NULL&&q->next!=NULL)
- {
- p2=(Long*)malloc(Len);
- p=p->next;
- q=q->next;
- n=p->num-r-q->num;
- if(n>=0)
- {
- r=0;
- p2->num=n;
- }
- else
- {
- r=1;*/
- //该片段来自于http://www.codesnippet.cn/detail/240120148647.html
来源: http://www.codesnippet.cn/detail/240120148647.html