数据结构大数相乘
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18: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 100
typedef 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 "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#define MAXSIZE 100
typedef 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);
else
S->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;
else
return 0;
}
int Pop_SeqStack(PSeqStack S,int *x)