《C语言课程设计》
课程设计×10k-1+a[k-1]×10k-2+…+a[2]×10+a[1]
其中a[0]保存该大数的位数。
实现两个大数相乘;
在此基础上实现两个大数相除。
4、设计目标
用数组表示每一个大数,同时实现大数相乘和两个大数相除
概要设计
问题解决的思路概述
首先是确定结构化程序设计的流程图,利用已存在的数据结构来构造一个存储大数的结构,接着把运算分成乘、除两个主要的模块:实现乘法的模块、实现除法的模块,然后各个模块里面还要分成若干种情况来考虑并通过函数的嵌套调用来实现其功能。最后,编写main主函数以实现大整数的正确输入与正确输出,调试程序并将不足的地方加以修改。总而言之,就是先用自顶向下、逐步细化的设计方法来分析并画出程序设计流程图;然后用自下而上、逐步积累的设计方法来写出程序。
2、本程序下定义的相关函数
1、void jia(char *ch1 , char *ch2 , char *ch3)//大数相加函数,作用为将ch1、ch2之和存入ch3
2、void cheng(char *ch1 , char *ch2 , char *ch3) //定义函数cheng用来算乘法,ch1,ch2,ch3分别是被乘数字符串、乘数字符串、和结果字符串的首指针
4、void chu (char *ch1 , char *ch2 , char *ch3)
3、void Mod (char *ch1 , char *ch2);
/*声明存储两个操作数的字符串ch1,ch2
声明各个子函数*/
3、主程序的流程基函数调用说明
1)、主程序的简要流程图:
详细设计
1、数字存储的实现
大数计算的因数和结果精度一般是少则数十位,多则几万位。在C语言中定义的类型中精度最多只有二十多位,此次程序采取定义一个结构体类型存贮的方式来存放大数符号。
二则运算算法
在大数二则运算的程序设计中,每一部分都会调用一些其他其它函数来辅助完成运算(例如:对结构体变量的初始化,比较两个数的大小,将字符型数据转换成结构体类型数据和将结构体类型数据转换成字符型数据等),在这里主要说明二则运算的程序设计,其它函数的程序设计和具体调用关系请查看程序清单。
2.1乘法运算的实现
初始化游标i,j、字符串ch1和ch2的长度len1,len2、结果字符串的长度len3、临时变量temp、整形数组num1 num2 num3,并将其值全部初始化为0,利用两次for循环将字符数组中的每个值都转化为整型并存放至数组num1、num2中对应的位置, 将数组num1和num2中的各位数字依次相乘并向前进位,结果存入数组num3中, 检测两数相乘的结果的长度,并将各位转化为字符后存入字符串ch3中.在字符串的最后添上结束标志'\0'
程序如下:
2.2除法运算的实现
比较两字符串所代表数值的大小,ch1大则返回1,ch2大返回-1,相等时返回0,优先比较长度,长度相等时,从高位向低位依次比较大小,若全部相等返回0,初始化结果字符串为0,复制ch2的内容到ch5
程序如下:
用户使用说明
将程序导入Visual C++ 6.0;通过VC运行后你会看到以下情形:
此时输入:888888888888888888
再输入:444444444444444444
测试结果
如上图所示:在输入18个8和18个4后结果如下图所示:
实验程序
#include
#include
#define LIMIT 200
void jia(char *ch1 , char *ch2 , char *ch3)//大数相加函数,作用为将ch1、ch2之和存入ch3
{
int len1 = strlen (ch1) , len2 = strlen (ch2) , len3 , i , tmp , num1[LIMIT]={0} , num2[LIMIT]={0} , num3[LIMIT]={0};
//定义两字符串的长度len1,len2,游标i,临时变量tmp,初始化整型数组num1、num2、num3,所有成员全部为0,以便后面的操作
for (i=len1-1;i>=0;i--)
num1[len1-1-i] = ch1[i] - 48;
for (i=len2-1;i>=0;i--)
num2[len2-1-i] = ch2[i] - 48;
//利用循环将字符串中的每个字符转化为整型后存入数组num1,num2
i = 0 , tmp = 0 , len3 = len1 > len2 ? len1 : len2;
//将len1和len2中较大的值赋给len3
wh