《数据结构课程设计-大数问题》由会员分享,可在线阅读,更多相关《数据结构课程设计-大数问题(11页珍藏版)》请在金锄头文库上搜索。
1、大数运算问题的程序设计例 如 : 输 入 第 一 个 数 为 : 1234567890987654321, 输 入 第 二 个 数 为 :1239874355878921367863则 输 出 结 果 : 1234567890987654321*1239874355878921367863=正 确 答 案 。源 程 序 :#include stdio.h #include malloc.h#include string.h#define MAX 20typedef char DataType;typedef struct DataType dataMAX;int top;SeqStack,*P
2、SeqStack; int StackEmpty(PSeqStack S)return S-top=-1; int StackFull(PSeqStack S)return S-top=MAX-1; void Push(PSeqStack S,DataType x)if(StackFull(S)printf(栈 中 元 素 已 经 满 了 !请 先 出 栈 或 把 栈 置 空 !n);S-data+S-top=x; DataType Pop(PSeqStack S)if(StackEmpty(S)printf(栈 为 空 ,无 法 出 栈 ,请 检 查 a!n);return S-dataS-
3、top-; DataType StackTop(PSeqStack S)if(StackEmpty(S)printf(栈 为 空 ,无 法 出 栈 ,请 检 查 !n);return S-dataS-top; void Add(PSeqStack M,PSeqStack N,PSeqStack addnumber) /加 法 函 数 int zongshu,shiweishu=0;if(M-top=N-top)while(M-top!=-1)zongshu=Pop(M)-48+Pop(N)-48+shiweishu;shiweishu=zongshu/10;Push(addnumber,(zo
4、ngshu%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=Pop(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+shiwe
5、ishu;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);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(P
6、op(M)=Pop(N)kk=(Pop(M)-48)-(Pop(N)-48);Push(addnumber,(kk+48);elsePush(addnumber,(Pop(M)-48)+10-(Pop(N)-48)+48);Push(M,(Pop(M)-1);j=N-top+1; else 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
7、,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;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,i
8、nt s)int i,j,m=0;for(j=39;j=0;j-) for(i=0;i=0;i-)change1(D,Bi,A);change2(D,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);
9、i+)Push(/printf(%c,StackTop(printf(*请 输 入 第 二 个 大 数 *n);printf(该 数 应 该 长 度 应 小 于 %d 位 n,MAX);gets(B);for(i=0;istrlen(B);i+)Push(/printf(%c,StackTop(printf(select 1:Add()n); /选 择 加 法printf(select 2:Minus()n); /选 择 减 法printf(select 3:Multiply()n); /选 择 乘 法printf(select 0:exitn); /选 择 退 出printf(input a
10、 your select(0-4):n);scanf(%d, if(select!=0)switch(select) case 1: Add(printf(大 数 加 法 计 算 的 结 果 是 :n);printf(%s+%s=,A,B);while(addnumber.top!=-1)printf(%c,Pop(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(printf(n);break;case 3:printf(大 数 乘 法 计 算 的 结 果 是 :n);printf(%s*%s=,A,B);Multiply(A,B);printf(n);break; 测 试 :1 加法测试:2 乘法测试:2013-07-25-sjn