- 1、本文档共33页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
大整数运算C语言实现C语言大作业报告源码
一、设计高精度无符号大整数计算
(以1为存储单位)
1.1 需求陈述
对数值很大、精度很高的数进行高精度大整数计算是一类十分常见的问题。但由于C语言中数据类型受数据长度和范围限制,普通数学计算很难实现此类问题,为尝试解决这个问题,专门设计一个C语言程序用于无符号大整数的计算,实现无符号大整数的一般计算和比较功能。
1.2 需求分析
1.2.1 功能分析
表1 程序功能分析
项目 功能 分析 BigN 数据接收 以字符串形式接受 反转字符串函数Invert() 用Translate()将字符串翻译为整形数组 数据
运算 分别用BigN_cmp_low()和BigN_cmp_High()对数据进行比较
//从a[1]对数组进行比较,传入两个数组及其大小以及需要从第几位开始比较
int BigN_cmp_High(int *, int *, int , int );
//从a[n]对数组进行比较,传入两个数组及其大小 加法BigN_Add() 减法BigN_Min() 低位减法BigN_Min_low(),在未反转的情况下计算 乘法BigN_Mul() 除法BigN_Div() 运算辅助函数 反转整形数组InvertInt() 从前面删减多余的零Del_zero_low() 从末尾删减多余的零Del_zero_High() 获取两个数的最大值Get_MAX()
1.2.2 数据分析
该程序可用于计算无符号大整形数据计算,最多可计算长度为200位(即10的200次方大小)的数据,但在原代码中可以随数据需求改变最大长度。该程序中所有运算和比较均考虑到了输入前导0(例0001)的情况。由于数据类型限制,该程序未加入小数计算和负数计算,除法结果中只分别计算商和余数。
1.2.3 技术约束
本程序已在code blocks下编译通过。
1.3 总体设计
1.3.1 全局数据结构
本程序中数据采取以个位数字为单位存入整形数组,在数据计算和比较中对单个数组单元进行操作。采用整形数组存储,主要优点为可以在该程序的基础上进行改进,使字符串中每四个数字或更多存入一个数组单元中(如程序二)。
1.3.2 函数设计
A.数据的接收
1.反转字符串函数 Invert()
函数原型:void Invert (char * , int );
功能: 反转字符串,传入字符串首地址和长度
在加法、减法、乘法计算中必须先对字符串进行反转,是字符串整体逆转,但不改变字符串长度。
2. 翻译字符串函数 Translate()
函数原型:void Translate (char *, int *, int *);
功能:将字符串翻译为数组,传入字符串和数组及数组大小的地址
B. 数据运算
1. 比较函数 BigN_cmp_low()和BigN_cmp_High()
函数原型:int BigN_cmp_low (int *, int *, int , int , int );
和int BigN_cmp_High(int *, int *, int , int );
功能:对整形数组分别进行地位和高位比较,即从开头和结尾开始进行比较。
实现步骤:先将数组中不必要的零去掉,然后记下位数,对位数进行比较,最后从原始数据最高位进行比较,逐步往下比较,若前面小于后面,则返回值为1,;若后面小于前面,则返回-1;若相等,则返回值为0.
2. 加法BigN_Add()
函数原型:void BigN_Add (int *, int *, int , int *);
功能:高精度加法,传入反转后的数组及其大小的最大值,和结果数组的首地址。
实现步骤:依次将所需计算的两个数组及其位数的最大值传入函数,对两个函数每一位进行加法存入结果中,对满十的结果进行进位,然后对该位进行对十取余存入结果。
实现代码:for(i = 1; i = max; i++)
{
res[i] += num1[i] + num2[i];
res[i+1] += res[i] / 10;
res[i] %= 10;
}
3. 减法BigN_Min()和低位减法BigN_Min_low()
函数原型:void BigN_Min (int *, int *, int , int *);
void
文档评论(0)