当前位置:文档之家› 大数据结构课程设计--大数相乘

大数据结构课程设计--大数相乘

数据结构课程设计报告学号::王建春班级:信息一班教师:容:大数相乘日期:2014年6月30日课题名称:大数相乘1.问题描述计算机的存有限,而且各个函数类型的围有限,如果要计算两个更大的乘数,就会超出围,得到不精确的数,如何得到更精确的数,而又不受计算机存空间的限制,本程序就可以解决大数相乘的问题。

2.设计思路这个程序的关键是如何保存大数的各个数字,以及如何处理大数乘法的进位问题。

本人是运用栈的思想做的,先定义一个整型的栈,大数传入栈的整型数组中,在乘法运算函数中,先从一个栈中取出一个大数S1的个位上的数字a,再从另一个大数S2取出一个个位数字b,再将a*b+d(d为进位数)的个位数字压到栈S中,十位上进位的数字先保存到d中,再从S2中取出一个十位数,与a相乘,得到的个位数字再压到栈S中,再从S2中取出一个数字,以此类推,直到S2中的数字被a乘完,得到一个新的大数S,将该栈保存到A栈中,将S 销毁,再从S1中取出大数的十位数字,与S2的各个数字相乘,得到一个新的大数压到S中,将S保存到B中,将B移位处理后,然后与A相加得到另一个大数,以此类推,最终可相加得到想要的结果。

这其中还用到了大数相加的原理。

3.数据结构设计前面提到,要用到栈的操作,这里,由于一个大数的最大长度是一定的,且大数最多执行的操作是插入和删除操作,所以顺序存储结构可以带来更大益处。

为了便于大数相加,将大数的各个数字存入到整型数组中。

#define MAXSIZE 1500typedef struct node{int data[MAXSIZE];int top;}SeqStack,*PSeqStack;4.功能函数设计(1)栈初始化函数Init_SeqStack(char *ch)此函数是将传入的字符处理成0~9的整数存入整型数组中。

将*ch-’0’转化为整数存入S->data[i]中,结束标志是*ch不等于’\0’(2)首尾倒置函数Convert_SeqStack(PSeqStack A)此函数是将栈中的数值首尾颠倒,比如以前是1234,现在变成4321。

只要将传入的A的栈中的元素依次取出压到C中,再返回C栈即可(3)大数相加函数Add(PSeqStack S1,PSeqStack S2)此函数是处理两个大数相加的功能。

将传入的两个大数压到S1和S2中,当S1或S2不为空时,从S1中取出a,从S2中取出b,得到Result=(a+b)%10+d,其中初始时d=0,再判断Result是否大于10,如果小于10直接压到栈S中,如果大于10将Result%10压入栈中,令d=(a+b)/10+Result/10;如果运算后其中的一个栈空了,另一个不空的栈的数值加上进位数d再直接压到S中,这样可以得到一个大数。

(4)移位函数Crol(PSeqStack S,int n)将其中一位大数取出一位数字与另一位大数相乘的结果移位,然后相加,从各位开始,每乘一个数,都要移位一个0(5)复制函数Copy_SeqStack(PSeqStack A,PSeqStack B)将一个A栈中的元素拷贝到B栈中,先将A中的元素压到C栈中,再将C栈中的元素压到B栈中,即可实现复制功能(6)大数相乘函数Multiply(PSeqStack S1,PSeqStack S2)此函数是实现大数相乘的核心算法。

主要思想就是将S1中取出个位数a,分别与S2中的各个数相乘得到新的大数,再取S1中的十位数,与S1大数相乘,以此类推,然后将各个大数进行移位处理再相加5.编码实现#include "stdlib.h"#include "stdio.h"#include "string.h"#define MAXSIZE 1500typedef struct node{int data[MAXSIZE];int top;}SeqStack,*PSeqStack;void Destroy_SeqStack(PSeqStack *S){if(*S)free(*S);*S=NULL;return;}int Push_SeqStack(PSeqStack S,int x) {if(S->top==MAXSIZE-1)return 0;else{S->top++;S->data[S->top]=x;return 1;}}PSeqStack Init_SeqStack(char *ch) {PSeqStack S;int i=0;char *head;S=(PSeqStack)malloc(sizeof(SeqStack));if(S)S->top=-1;head=ch;while(*ch!='\0'){if(*head=='-')S->data[i]=(*(++ch)-'0')*(-1);elseS->data[i]=*ch-'0';ch++;S->top++;i++;}return S;}int GetTop_SeqStack(PSeqStack S,int *x) {if(S->top==-1)return 0;else{*x=S->data[S->top];return 1;}}int Empty_SeqStack(PSeqStack S){if(S->top==-1)return 1;elsereturn 0;}int Pop_SeqStack(PSeqStack S,int *x) {if(Empty_SeqStack(S))return 0;else{*x=S->data[S->top];S->top--;return 1;}}void print(PSeqStack S){int i;for(i=0;i<=S->top;i++)printf("%d",S->data[i]);}//将栈顶变成栈尾,栈尾变成栈顶PSeqStack Convert_SeqStack(PSeqStack A) {int x;PSeqStack C;C=(PSeqStack)malloc(sizeof(SeqStack));if(C)C->top=-1;while(!Empty_SeqStack(A)){Pop_SeqStack(A,&x);Push_SeqStack(C,x);}return C;}PSeqStack Add(PSeqStack S1,PSeqStack S2){PSeqStack S;int d=0,a,b,Result;S=(PSeqStack)malloc(sizeof(SeqStack));if(S)S->top=-1;while(!Empty_SeqStack(S1)&&!Empty_SeqStack(S2)) {Pop_SeqStack(S1,&a);Pop_SeqStack(S2,&b);Result=(a+b)%10+d;//判断Result是否大于等于10if(Result/10==0){Push_SeqStack(S,Result);d=(a+b)/10;}else if(Result/10>0){Push_SeqStack(S,Result%10);d=(a+b)/10+Result/10;}}while(!Empty_SeqStack(S1)){Pop_SeqStack(S1,&a);Result=a%10+d;if(Result/10==0){Push_SeqStack(S,Result);d=a/10;}else{Push_SeqStack(S,Result%10);d=a/10+Result/10;}}while(!Empty_SeqStack(S2)){Pop_SeqStack(S2,&a);Result=a%10+d;if(Result/10==0){Push_SeqStack(S,Result);d=a/10;}else{Push_SeqStack(S,Result%10);d=a/10+Result/10;}}if(d!=0)Push_SeqStack(S,1);S=Convert_SeqStack(S);return S;}PSeqStack Crol(PSeqStack S,int n){int i;for(i=0;i<n;i++)Push_SeqStack(S,0);return S;}void Copy_SeqStack(PSeqStack A,PSeqStack B) {PSeqStack C;int x;C=(PSeqStack)malloc(sizeof(SeqStack));if(C)C->top=-1;while(!Empty_SeqStack(A)){Pop_SeqStack(A,&x);Push_SeqStack(C,x);}while(!Empty_SeqStack(B)){Pop_SeqStack(B,&x);}while(!Empty_SeqStack(C)){Pop_SeqStack(C,&x);Push_SeqStack(A,x);Push_SeqStack(B,x);}}PSeqStack Multiply(PSeqStack S1,PSeqStack S2) {PSeqStack S,A,B;int a,b,c,d=0,Result,i,count=0;S=(PSeqStack)malloc(sizeof(SeqStack));if(S)S->top=-1;A=(PSeqStack)malloc(sizeof(SeqStack));if(A)A->top=-1;B=(PSeqStack)malloc(sizeof(SeqStack));if(B)B->top=-1;while(!Empty_SeqStack(S1)){Pop_SeqStack(S1,&a);d=0;for(i=S2->top;i>-1;i--){b=S2->data[i];//printf("%d,",b);Result=a*b%10+d;if(Result/10==0){Push_SeqStack(S,Result);d=a*b/10;}else if(Result/10>0){Push_SeqStack(S,Result%10);d=a*b/10+Result/10;}}if(d!=0)Push_SeqStack(S,d);//printf("\nS为:");//print(S);S=Convert_SeqStack(S);if(count==0){Copy_SeqStack(S,A);//将S栈拷贝到A栈//printf("\nA为:");//print(A);}else{B=Crol(S,count);//将B左移count位//printf("\nB为:");//print(B);A=Add(A,B);//printf("\nA为:");//print(A);}count++;Destroy_SeqStack(&S);S=(PSeqStack)malloc(sizeof(SeqStack));if(S)S->top=-1;}A=Convert_SeqStack(A);while(GetTop_SeqStack(A,&c)&&c==0)Pop_SeqStack(A,&c);if(Empty_SeqStack(A))Push_SeqStack(A,0);A=Convert_SeqStack(A);return A;}void main(){PSeqStack A,B,C;int i;//char *ch1={"29"},*ch2={"896"};//char *ch1={"99"},*ch2={"1"};//char *ch1={"1111"},*ch2={"1111"};//char *ch1={"11111111"},*ch2={"-11111111"};//char *ch1={"464"},*ch2={"0"};char ch1[MAXSIZE],ch2[MAXSIZE];printf("请输入第一个大数:");gets(ch1);printf("\n请输入第二个大数:");gets(ch2);printf("该乘式为:");A=Init_SeqStack(ch1);print(A);printf("*");B=Init_SeqStack(ch2);print(B);printf("\n");//C=Add(A,B);C=Multiply(A,B);printf("\n计算结果为:");for(i=0;i<=C->top;i++){printf("%d",C->data[i]);}// print(C);printf("\n");//printf("实际结果为:225");}6.运行与测试首先屏幕会提示你输入第一个大数,然后按回车键,屏幕会提示你输入第二个大数,再按回车键,即可得到计算结果7.设计中存在的问题及感想本程序的缺陷对负数以及小数相乘没有处理好,只能处理大的整数,这是一个遗憾。

相关主题