数据结构大数相乘

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档