《大数据结构课程设计-大数问题.doc》由会员分享,可在线阅读,更多相关《大数据结构课程设计-大数问题.doc(11页珍藏版)》请在三一办公上搜索。
1、大数运算问题的程序设计源程序:#include stdio.h #include malloc.h#include string.h#define MAX 20typedef char DataType;typedef struct DataType dataMAX; int top;SeqStack,*PSeqStack; int StackEmpty(PSeqStack S) return S-top=-1; int StackFull(PSeqStack S) return S-top=MAX-1; void Push(PSeqStack S,DataType x) if(StackFu
2、ll(S) printf(栈中元素已经满了!请先出栈或把栈置空!n); S-data+S-top=x; DataType Pop(PSeqStack S) if(StackEmpty(S) printf(栈为空,无法出栈,请检查a!n); return S-dataS-top-; DataType StackTop(PSeqStack S) if(StackEmpty(S) printf(栈为空,无法出栈,请检查!n); return S-dataS-top; void Add(PSeqStack M,PSeqStack N,PSeqStack addnumber) /加法函数 int zon
3、gshu,shiweishu=0; if(M-top=N-top) while(M-top!=-1) zongshu=Pop(M)-48+Pop(N)-48+shiweishu; shiweishu=zongshu/10; Push(addnumber,(zongshu%10+48); else if(M-topN-top) while(N-top!=-1) zongshu=Pop(M)-48+Pop(N)-48+shiweishu; shiweishu=zongshu/10; Push(addnumber,(zongshu%10+48); while(M-top!=-1) zongshu=P
4、op(M)-48+shiweishu; shiweishu=zongshu/10; Push(addnumber,(zongshu%10+48); else if(M-toptop) while(M-top!=-1) zongshu=Pop(M)-48+Pop(N)-48+shiweishu; shiweishu=zongshu/10; Push(addnumber,(zongshu%10+48); while(N-top!=-1) zongshu=Pop(N)-48+shiweishu; shiweishu=zongshu/10; Push(addnumber,(zongshu%10+48)
5、; int Minus(PSeqStack M,PSeqStack N,PSeqStack addnumber) /减法函数 int j=0;int kk;if(M-top=N-top) for(j=0;jtop;j+) if(M-datajN-dataj)while(N-top!=-1) if(Pop(M)=Pop(N) kk=(Pop(M)-48)-(Pop(N)-48); Push(addnumber,(kk+48); else Push(addnumber,(Pop(M)-48)+10-(Pop(N)-48)+48); Push(M,(Pop(M)-1);j=N-top+1; else
6、 if(M-datajdataj) printf(被减数比减数小!请检查a!n); j=N-top+1; Push(addnumber,0);return 1; else if(M-topN-top) while(N-top!=-1) if(Pop(N)top!=-1) Push(addnumber,Pop(M); return 1; else if(M-toptop) printf(被减数比减数小!请检查!n); return 0; void change1(int (*P1)40,char s,char P220) /以下为乘法函数 static int n=0; int j,i,m=0;
7、 for(i=(strlen(P2)-1),j=39-n;i=0;i-,j-) P1nj=(P2i-48)*(s-48)+m)%10; m=(P2i-48)*(s-48)+m)/10; if(m!=0) P1nj=m; n+;void change2(int (*P)40,int* Q,int s) int i,j,m=0; for(j=39;j=0;j-) for(i=0;is;i+) Qj+=Pij; Qj=Qj+m; m=Qj/10; Qj=Qj%10; void puts(int *Q) int i; for(i=0;i=0;i-) change1(D,Bi,A);change2(D,
8、C,strlen(B);puts(C);void main() SeqStack M,N,addnumber;int select;size_t i;/char y;char AMAX,BMAX;M.top=-1;N.top=-1; addnumber.top=-1;printf(*请输入第一个大数*n);printf(该数应该长度应小于%d位n,MAX); gets(A);for(i=0;istrlen(A);i+) Push(&M,Ai); /printf(%c,StackTop(&M);printf(*请输入第二个大数*n);printf(该数应该长度应小于%d位n,MAX); gets
9、(B);for(i=0;istrlen(B);i+) Push(&N,Bi); /printf(%c,StackTop(&N);printf(select 1:Add()n); /选择加法 printf(select 2:Minus()n); /选择减法 printf(select 3:Multiply()n); /选择乘法 printf(select 0:exitn); /选择退出 printf(input a your select(0-4):n);scanf(%d,&select); if(select!=0) switch(select) case 1: Add(&M,&N,&addn
10、umber); printf(大数加法计算的结果是:n); printf(%s+%s=,A,B); while(addnumber.top!=-1) printf(%c,Pop(&addnumber); printf(n); break; case 2: if(Minus(&M,&N,&addnumber) /如果返回值为0如此说明被减数比减数小,这样就不用再执行下面的语句了; printf(大数减法计算的结果是:n); printf(%s-%s=,A,B); while(addnumber.top!=-1) printf(%c,Pop(&addnumber); printf(n); break; case 3: printf(大数乘法计算的结果是:n); printf(%s*%s=,A,B); Multiply(A,B); printf(n); break; 测试:1加法测试:2乘法测试: