数据结构大数相乘_小学教育-小学课件.pdf
《数据结构大数相乘_小学教育-小学课件.pdf》由会员分享,可在线阅读,更多相关《数据结构大数相乘_小学教育-小学课件.pdf(49页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、v.资 料.课题名称:大数相乘 1.问题描述 计算机的内存有限,而且各个函数类型的范围有限,如果要计算两个更大的乘数,就会超出范围,得到不精确的数,如何得到更精确的数,而又不受计算机内存空间的限制,本程序就可以解决大数相乘的问题。2.设计思路 这个程序的关键是如何保存大数的各个数字,以及如何处理大数乘法的进位问题。本人是运用栈的思想做的,先定义一个整型的栈,大数传入栈的整型数组中,在乘法运算函数中,先从一个栈中取出一个大数 S1的个位上的数字 a,再从另一个大数 S2 取出一个个位数字 b,再将 a*b+d(d 为进位数)的个位数字压到栈 S 中,十位上进位的数字先保存到 d 中,再从 S2
2、中取出一个十位数,与 a 相乘,得到的个位数字再压到栈 S 中,再从 S2 中取出一个数字,以此类推,直到 S2 中的数字被 a 乘完,得到一个新的大数 S,将该栈保存到 A 栈中,将 S 销毁,再从 S1中取出大数的十位数字,与 S2 的各个数字相乘,得到一个新的大数压到 S 中,将 S 保存到 B 中,将 B 移位处理后,然后与 A相加得到另一个大数,以此类推,最终可相加得到想要的结果。这其中还用到了大数相加的原理。v.资 料.3.数据结构设计 前面提到,要用到栈的操作,这里,由于一个大数的最大长度是一定的,且大数最多执行的操作是插入和删除操作,所以顺序存储结构可以带来更大益处。为了便于大
3、数相加,将大数的各个数字存入到整型数组中。#define MAXSIZE 100 typedef struct node int dataMAXSIZE;int top;SeqStack,*PSeqStack;4.功能函数设计(1)栈初始化函数 Init_SeqStack(char*ch)此函数是将传入的字符处理成 09 的整数存入整型数组中。将*ch-0 转化为整数存入 S-datai 中,结束标志是*ch 不等于 0(2)首尾倒置函数 Convert_SeqStack(PSeqStack A)此函数是将栈中的数值首尾颠倒,比如以前是 1234,现在变成 4321。只要将传入的 A 的栈中的
4、元素依次取出压到 C 中,再返回 C 栈即可(3)大数相加函数 Add(PSeqStack S1,PSeqStack S2)此函数是处理两个大数相加的功能。将传入的两个大数压到 S1和 S2中,当 S1或 S2 不为空时,从 S1中取出 a,从 S2 中取出 b,得到范围得到不精确的数如何得到更精确的数而又不受计算机内存空间的限制本程序就可以解决大数相乘的问题设计思路这个程序的关键是如何保存大数的各个数字以及如何处理大数乘法的进位问题本人是运用栈的思想做的先定义一个 取出一个个位数字再将为进位数的个位数字压到栈中十位上进位的数字先保存到中再从中取出一个十位数与相乘得到的个位数字再压到栈中再从中
5、取出一个数字以此类推直到中的数字被乘完得到一个新的大数将该栈保存到栈中将销 到另一个大数以此类推最终可相加得到想要的结果这其中还用到了大数相加的原理资料数据结构设计前面提到要用到栈的操作这里由于一个大数的最大长度是一定的且大数最多执行的操作是插入和删除操作所以顺序存储结构可以带v.资 料.Result=(a+b)%10+d,其中初始时 d=0,再判断 Result 是否大于 10,如果小于 10 直接压到栈 S 中,如果大于 10 将 Result%10 压入栈中,令 d=(a+b)/10+Result/10;如果运算后其中的一个栈空了,另一个不空的栈的数值加上进位数 d 再直接压到 S中,这
6、样可以得到一个大数。(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 中的各个数相乘得到新的
7、大数,再取 S1中的十位数,与 S1大数相乘,以此类推,然后将各个大数进行移位处理再相加 5.编码实现#include stdafx.h#include stdlib.h#include stdio.h#include string.h#define MAXSIZE 100 typedef struct node 范围得到不精确的数如何得到更精确的数而又不受计算机内存空间的限制本程序就可以解决大数相乘的问题设计思路这个程序的关键是如何保存大数的各个数字以及如何处理大数乘法的进位问题本人是运用栈的思想做的先定义一个 取出一个个位数字再将为进位数的个位数字压到栈中十位上进位的数字先保存到中再从中取
8、出一个十位数与相乘得到的个位数字再压到栈中再从中取出一个数字以此类推直到中的数字被乘完得到一个新的大数将该栈保存到栈中将销 到另一个大数以此类推最终可相加得到想要的结果这其中还用到了大数相加的原理资料数据结构设计前面提到要用到栈的操作这里由于一个大数的最大长度是一定的且大数最多执行的操作是插入和删除操作所以顺序存储结构可以带v.资 料.int dataMAXSIZE;int top;SeqStack,*PSeqStack;void Destroy_SeqStack(PSeqStack*S)if(*S)free(*S);*S=NULL;return;int Push_SeqStack(PSeqS
9、tack S,int x)if(S-top=MAXSIZE-1)return 0;else S-top+;S-dataS-top=x;return 1;范围得到不精确的数如何得到更精确的数而又不受计算机内存空间的限制本程序就可以解决大数相乘的问题设计思路这个程序的关键是如何保存大数的各个数字以及如何处理大数乘法的进位问题本人是运用栈的思想做的先定义一个 取出一个个位数字再将为进位数的个位数字压到栈中十位上进位的数字先保存到中再从中取出一个十位数与相乘得到的个位数字再压到栈中再从中取出一个数字以此类推直到中的数字被乘完得到一个新的大数将该栈保存到栈中将销 到另一个大数以此类推最终可相加得到想要的
10、结果这其中还用到了大数相加的原理资料数据结构设计前面提到要用到栈的操作这里由于一个大数的最大长度是一定的且大数最多执行的操作是插入和删除操作所以顺序存储结构可以带v.资 料.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-datai=(*(+ch)-0)*(-1);else S-datai=*ch-0;ch+;S-top+;i+;return S;范围
11、得到不精确的数如何得到更精确的数而又不受计算机内存空间的限制本程序就可以解决大数相乘的问题设计思路这个程序的关键是如何保存大数的各个数字以及如何处理大数乘法的进位问题本人是运用栈的思想做的先定义一个 取出一个个位数字再将为进位数的个位数字压到栈中十位上进位的数字先保存到中再从中取出一个十位数与相乘得到的个位数字再压到栈中再从中取出一个数字以此类推直到中的数字被乘完得到一个新的大数将该栈保存到栈中将销 到另一个大数以此类推最终可相加得到想要的结果这其中还用到了大数相加的原理资料数据结构设计前面提到要用到栈的操作这里由于一个大数的最大长度是一定的且大数最多执行的操作是插入和删除操作所以顺序存储结构
12、可以带v.资 料.int GetTop_SeqStack(PSeqStack S,int*x)if(S-top=-1)return 0;else*x=S-dataS-top;return 1;int Empty_SeqStack(PSeqStack S)if(S-top=-1)return 1;else return 0;int Pop_SeqStack(PSeqStack S,int*x)范围得到不精确的数如何得到更精确的数而又不受计算机内存空间的限制本程序就可以解决大数相乘的问题设计思路这个程序的关键是如何保存大数的各个数字以及如何处理大数乘法的进位问题本人是运用栈的思想做的先定义一个 取
13、出一个个位数字再将为进位数的个位数字压到栈中十位上进位的数字先保存到中再从中取出一个十位数与相乘得到的个位数字再压到栈中再从中取出一个数字以此类推直到中的数字被乘完得到一个新的大数将该栈保存到栈中将销 到另一个大数以此类推最终可相加得到想要的结果这其中还用到了大数相加的原理资料数据结构设计前面提到要用到栈的操作这里由于一个大数的最大长度是一定的且大数最多执行的操作是插入和删除操作所以顺序存储结构可以带v.资 料.if(Empty_SeqStack(S)return 0;else*x=S-dataS-top;S-top-;return 1;void print(PSeqStack S)int i
14、;for(i=0;itop;i+)printf(%d,S-datai);/将栈顶变成栈尾,栈尾变成栈顶 PSeqStack Convert_SeqStack(PSeqStack A)int x;范围得到不精确的数如何得到更精确的数而又不受计算机内存空间的限制本程序就可以解决大数相乘的问题设计思路这个程序的关键是如何保存大数的各个数字以及如何处理大数乘法的进位问题本人是运用栈的思想做的先定义一个 取出一个个位数字再将为进位数的个位数字压到栈中十位上进位的数字先保存到中再从中取出一个十位数与相乘得到的个位数字再压到栈中再从中取出一个数字以此类推直到中的数字被乘完得到一个新的大数将该栈保存到栈中将销
15、 到另一个大数以此类推最终可相加得到想要的结果这其中还用到了大数相加的原理资料数据结构设计前面提到要用到栈的操作这里由于一个大数的最大长度是一定的且大数最多执行的操作是插入和删除操作所以顺序存储结构可以带v.资 料.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=
16、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);范围得到不精确的数如何得到更精确的数而又不受计算机内存空间的限制本程序就可以解决大数相乘的问题设计思路这个程序的关键是如何保存大数的各个数字以及如何处理大数乘法的进位问题本人是运用栈的思想做的先定义一个 取出一个个位数字再将为进位数的个位数字压到栈中十位上进位的数字先保存到中再从中取出一个十位数与相乘得到的个位数字再压到栈中再从中取出一个数
17、字以此类推直到中的数字被乘完得到一个新的大数将该栈保存到栈中将销 到另一个大数以此类推最终可相加得到想要的结果这其中还用到了大数相加的原理资料数据结构设计前面提到要用到栈的操作这里由于一个大数的最大长度是一定的且大数最多执行的操作是插入和删除操作所以顺序存储结构可以带v.资 料.Pop_SeqStack(S2,&b);Result=(a+b)%10+d;/判断 Result 是否大于等于 10 if(Result/10=0)Push_SeqStack(S,Result);d=(a+b)/10;else if(Result/100)Push_SeqStack(S,Result%10);d=(a+
18、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;范围得到不精确的数如何得到更精确的数而又不受计算机内存空间的限制本程序就可以解决大数相乘的问题设计思路这个程序的关键是如何保存大数的各个数字以及如何处理大数乘法的进位问题本人是运用栈的思想做的先定义一个 取出一个个位数字再将为进位数的个位数字压到栈中十位上进位的数字先保存到中再从中取出一个十位数与相乘得到的个位数字再压到栈中再从中取出一个数字以此类推直到中
19、的数字被乘完得到一个新的大数将该栈保存到栈中将销 到另一个大数以此类推最终可相加得到想要的结果这其中还用到了大数相加的原理资料数据结构设计前面提到要用到栈的操作这里由于一个大数的最大长度是一定的且大数最多执行的操作是插入和删除操作所以顺序存储结构可以带v.资 料.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_SeqS
20、tack(S,Result%10);d=a/10+Result/10;范围得到不精确的数如何得到更精确的数而又不受计算机内存空间的限制本程序就可以解决大数相乘的问题设计思路这个程序的关键是如何保存大数的各个数字以及如何处理大数乘法的进位问题本人是运用栈的思想做的先定义一个 取出一个个位数字再将为进位数的个位数字压到栈中十位上进位的数字先保存到中再从中取出一个十位数与相乘得到的个位数字再压到栈中再从中取出一个数字以此类推直到中的数字被乘完得到一个新的大数将该栈保存到栈中将销 到另一个大数以此类推最终可相加得到想要的结果这其中还用到了大数相加的原理资料数据结构设计前面提到要用到栈的操作这里由于一个
21、大数的最大长度是一定的且大数最多执行的操作是插入和删除操作所以顺序存储结构可以带v.资 料.if(d!=0)Push_SeqStack(S,1);S=Convert_SeqStack(S);return S;PSeqStack Crol(PSeqStack S,int n)int i;for(i=0;itop=-1;范围得到不精确的数如何得到更精确的数而又不受计算机内存空间的限制本程序就可以解决大数相乘的问题设计思路这个程序的关键是如何保存大数的各个数字以及如何处理大数乘法的进位问题本人是运用栈的思想做的先定义一个 取出一个个位数字再将为进位数的个位数字压到栈中十位上进位的数字先保存到中再从中
22、取出一个十位数与相乘得到的个位数字再压到栈中再从中取出一个数字以此类推直到中的数字被乘完得到一个新的大数将该栈保存到栈中将销 到另一个大数以此类推最终可相加得到想要的结果这其中还用到了大数相加的原理资料数据结构设计前面提到要用到栈的操作这里由于一个大数的最大长度是一定的且大数最多执行的操作是插入和删除操作所以顺序存储结构可以带v.资 料.while(!Empty_SeqStack(A)Pop_SeqStack(A,&x);Push_SeqStack(C,x);while(!Empty_SeqStack(B)Pop_SeqStack(B,&x);while(!Empty_SeqStack(C)P
23、op_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);范围得到不精确的数如何得到更精确的数而又不受计算机内存空间的限制本程序就可以解决大数相乘的问题设计思路这个程序的关键是如何保存大数的各个数字以及如何处理大数乘法的进位问题本人是运用栈的思想做的先定义一个 取出一个个位数字再将为进位
24、数的个位数字压到栈中十位上进位的数字先保存到中再从中取出一个十位数与相乘得到的个位数字再压到栈中再从中取出一个数字以此类推直到中的数字被乘完得到一个新的大数将该栈保存到栈中将销 到另一个大数以此类推最终可相加得到想要的结果这其中还用到了大数相加的原理资料数据结构设计前面提到要用到栈的操作这里由于一个大数的最大长度是一定的且大数最多执行的操作是插入和删除操作所以顺序存储结构可以带v.资 料.if(S)S-top=-1;A=(PSeqStack)malloc(sizeof(SeqStack);if(A)A-top=-1;B=(PSeqStack)malloc(sizeof(SeqStack);if
25、(B)B-top=-1;while(!Empty_SeqStack(S1)Pop_SeqStack(S1,&a);d=0;for(i=S2-top;i-1;i-)b=S2-datai;/printf(%d,b);Result=a*b%10+d;if(Result/10=0)Push_SeqStack(S,Result);d=a*b/10;范围得到不精确的数如何得到更精确的数而又不受计算机内存空间的限制本程序就可以解决大数相乘的问题设计思路这个程序的关键是如何保存大数的各个数字以及如何处理大数乘法的进位问题本人是运用栈的思想做的先定义一个 取出一个个位数字再将为进位数的个位数字压到栈中十位上进位
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 大数 相乘 小学教育 小学 课件
限制150内