[C/C++/C语言]设计一种结构能表示最多1000位的大整数(正、负均可),并实现这类数的乘运算。
用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;}
[解决办法]
请参考:
大数的四则运算及求模
大数的加减乘除和求模都是用C写的,你算多少位都不会有问题。
[解决办法]
C的来了。
- C/C++ code
#include <stdio.h>#include <string.h>#include <memory.h>#define MAX_LENGTH 1000typedef struct{ int m_sign; int m_len; char m_num[MAX_LENGTH];}BIG_NUMBER;BIG_NUMBER m_num;BIG_NUMBER BigNumberMultiply(BIG_NUMBER left, BIG_NUMBER R){ BIG_NUMBER Result; int i=1, j=1, carry=0; char *muti1,*muti2,*result=Result.m_num; int len1,len2; memset(result,0,MAX_LENGTH); Result.m_sign=left.m_sign * R.m_sign; muti1=left.m_num; muti2=R.m_num; len1=left.m_len; len2=R.m_len; for (i=len2-1;i>=0;i--) { for(j=len1-1;j>=0;j--) { result[(len2-1-i)+(len1-1-j)] += (muti1[j]-0x30)*(muti2[i]-0x30)+carry; carry=result[(len2-1-i)+(len1-1-j)] / 10; result[(len2-1-i)+(len1-1-j)] %= 10; } result[(len2-1-i)+(len1-1-j)]+=carry; carry=0; } result[(len2-1-i)+(len1-1-j)]+=carry; for(i=0; i<len1+len2;i++) { result[i]+=0x30; } strcpy(Result.m_num,_strrev(result)); Result.m_len=strlen(Result.m_num); return Result;}int main(void){ BIG_NUMBER left,right,result; left.m_len=9; left.m_sign=1; memset(left.m_num,0,MAX_LENGTH); right.m_len=9; right.m_sign=1; memset(right.m_num,0,MAX_LENGTH); strcpy(left.m_num,"999999999"); strcpy(right.m_num,"999999999"); result=BigNumberMultiply(left,right); printf("The result is %s\n",result.m_num); return 0;}