[C/C++/C语言]设计一种构造能表示最多1000位的大整数(正、负均可),并实现这类数的乘运算
[C/C++/C语言]设计一种结构能表示最多1000位的大整数(正、负均可),并实现这类数的乘运算。
用c做
------解决方案--------------------
用c做
------解决方案--------------------
- C/C++ code
/* 最笨的最原始的人类思想法 用第二个数的每一个位乘第一个数 得到的数据屁股不足零然后累加 下面的数据你想算100万位都可以,只要你的计算机内存够大 第一个数表示+或-,0表示+,1表示- */ #include "stdio.h" #include "stdlib.h" typedef struct MYNUMBER { char value; struct MYNUMBER *next; struct MYNUMBER *prev; }*BIGNUMBER; BIGNUMBER Mul(BIGNUMBER n1,BIGNUMBER n2); /*两数相乘*/ BIGNUMBER GetVal(char *str); /*用字串转换成大数*/ void DelVal(BIGNUMBER n); /*删除大数占用内存*/ void ShowVal(BIGNUMBER n); /*显示大数*/ void InitVal(BIGNUMBER n); /*大数置0*/ void Mulx(BIGNUMBER r,BIGNUMBER n,char d,int off); /*用大数n乘一个数d,屁股补off个0,结果给大数r*/ void Addx(BIGNUMBER r,BIGNUMBER n); /*用大数r加大数n,结果给大数r*/ void main() { BIGNUMBER x1,x2,y; x1=GetVal("-939874523423798462436234\0"); x2=GetVal("9873423624623462345235234\0"); y=Mul(x1,x2); ShowVal(x1); ShowVal(x2); ShowVal(y); DelVal(x1); DelVal(x2); DelVal(y); } BIGNUMBER GetVal(char *str) { char *ch; BIGNUMBER Head; BIGNUMBER Cur; Head=(BIGNUMBER)malloc(sizeof(MYNUMBER)); Head->value=-1; Head->next=NULL; Head->prev=NULL; Cur=Head; if(str) { ch=str; if(*ch=='-') { Head->value=1; ch++; } else Head->value=0; while(*ch) { BIGNUMBER p=(BIGNUMBER)malloc(sizeof(MYNUMBER)); p->value=*ch-0x30; p->next=NULL; Cur->next=p; p->prev=Cur; Cur=Cur->next; ch++; } } return Head; } void DelVal(BIGNUMBER n) { BIGNUMBER tmp1,tmp2; tmp1=tmp2=n; while(tmp2) { tmp2=tmp2->next; free(tmp1); tmp1=tmp2; } } void ShowVal(BIGNUMBER n) { BIGNUMBER tmp=n; printf("\n"); if(tmp->value==-1) { printf("Error Number\n"); return; } if(tmp->value==1) printf("-"); tmp=tmp->next; while(tmp) { printf("%d",tmp->value); tmp=tmp->next; } printf("\n"); } void InitVal(BIGNUMBER n) { BIGNUMBER tmp=n->next; while(tmp) { tmp->value=0; tmp=tmp->next; } } void Mulx(BIGNUMBER r,BIGNUMBER n,char d,int off) { BIGNUMBER Tail1,Tail2; char kk=0,tmp=0; int i; Tail1=r; while(Tail1->next) Tail1=Tail1->next; for(i=0;i<off;i++) Tail1=Tail1->prev; Tail2=n; while(Tail2->next) Tail2=Tail2->next; while(Tail2!=n) { tmp=Tail2->value*d+kk; Tail1->value=tmp%10; kk=tmp/10; Tail2=Tail2->prev; Tail1=Tail1->prev; } Tail1->value=kk; } void Addx(BIGNUMBER r,BIGNUMBER n) { BIGNUMBER Tail1,Tail2; char kk=0,tmp=0; Tail1=r; while(Tail1->next) Tail1=Tail1->next; Tail2=n; while(Tail2->next) Tail2=Tail2->next; while(Tail2!=n) { tmp=Tail1->value+Tail2->value+kk; Tail1->value=tmp%10; kk=tmp/10; Tail2=Tail2->prev; Tail1=Tail1->prev; } if(Tail1!=r) Tail1->value=kk; } BIGNUMBER Mul(BIGNUMBER n1,BIGNUMBER n2) { BIGNUMBER Head1,Head2; BIGNUMBER Tail,Cur,tmp; int len1=0,len2=0,len3=0; int i; int kk=0,off=0; Head1=(BIGNUMBER)malloc(sizeof(MYNUMBER)); Head1->next=NULL; Head1->prev=NULL; if((n1->value==-1)||(n2->value==-1)) Head1->value=-1; else { Head1->value=n1->value^n2->value; printf("\nAAAAA: %d",Head1->value); Tail=n1; while(Tail->next) { len1++; Tail=Tail->next; } Tail=n2; while(Tail->next) { len2++; Tail=Tail->next; } len3=len1+len2+2; Head2=(BIGNUMBER)malloc(sizeof(MYNUMBER)); Head2->value=0; Head2->prev=NULL; Head2->next=NULL; Cur=Head1; for(i=0;i<len3;i++) { BIGNUMBER p=(BIGNUMBER)malloc(sizeof(MYNUMBER)); p->value=0; p->next=NULL; Cur->next=p; p->prev=Cur; Cur=Cur->next; } Cur=Head2; for(i=0;i<len3;i++) { BIGNUMBER q=(BIGNUMBER)malloc(sizeof(MYNUMBER)); q->value=0; q->next=NULL; Cur->next=q; q->prev=Cur; Cur=Cur->next; } Cur=Tail; off=0; while(Cur!=n2) { InitVal(Head2); Mulx(Head2,n1,Cur->value,off); Addx(Head1,Head2); Cur=Cur->prev; off++; } Cur=Head1->next; while(Cur->value==0) { tmp=Cur; Cur=Cur->next; tmp->next->prev=tmp->prev; tmp->prev->next=tmp->next; free(tmp); } Cur=Head2; while(Cur) { Cur=Cur->next; free(Head2); Head2=Cur; } } return Head1; }