通信与信息工程学院软件实验报告
通过学习,了解到进制之间转换的基本算法,通过编程可以实现任意进制间的转换。当然,在计算机内部执行进制转换算法时,都是以二进制数作为纽带进行计算的。
21
通信与信息工程学院软件实验报告
题目三:R019M
实验要求:
输入一个自然数n,求n! ,同时统计结果中有多少个0。
1、问题分析与方案设计。
在微软的Windows操作系统中,目前主流的版本分为32位操作系统和64位操作系统,本次实验采用的是32位的操作系统。在32位操作系统的微机中,存储一个数所能够达到的最大值为232-1=4294967295,如果超出这个数字,就会发生溢出,使得最后得到的结果不是正确的数值。
经过测算,如果使用常规的算法,n的阶乘最多可以计算到12!,当计算比12大的数字的阶乘时就发生了溢出,不能得出正确的计算结果。
为了解决一般算法不能计算大数阶乘的问题,本次实验采用了一位数组代替32位比特数存储数据的方法,虽然在一定程度上造成了计算机存储空间的浪费,但是却能够较好地实现大数据的阶乘,从而使程序具有更强的可靠性和更强的鲁棒性。
程序中首先定义了一个包含有10000个元素的一维整型数组,用来存储运算结果中每一位的数字0~9,虽然采用字符数组能够减少存储空间的浪费,但是考虑到算法的复杂度,最终采用了一维整型数组的存储方式。程序算法采用了按位计算,逐位存储的方法,把每一位的计算结果都用一位数组的一个元素来存储,从低位到高位依次进行。当计算结果的位数超出预先定义的整型一位数组的元素个数时,也会发生溢出,使得最终的结果不正确。所以,当整型一维数组的元素个数越多时,所能计算的n的数值也就越大,但是最终也不能无限制的增大,因为整型一维数组的元素个数是已定的,是有所约束的。当然,这个问题也可以用C语言中的申请一维动态空间的方式来解决,这种方法在本次实验中没有使用,只是使用了一维数组的方式。
实验要求统计计算结果中“0”的个数。本次程序实现的算法比较简单,考虑到n阶乘的计算结果以从低到高一位接一位的方式依次存储在一维数组的各个
22
通信与信息工程学院软件实验报告
元素中,故可以采用将数组的每一个元素依次和数字“0”进行比较的方法,如果数组的某一位与“0”相等,则“0”的个数加1,运用这种逐个元素进行比较方法,可以最终得出计算结果中所含“0”的个数。
本次试验程序还加入了欢迎、退出界面和输入数据判断子程序,当输入不符合实验要求的数据时,程序会自动提醒用户重新输入,直到输入正确的数据为止。通过这些子程序,可以使得整个程序看起来更加舒服,可读性更强,也增加了程序的可靠性。
具体的程序流程图如下: 开始
1. 输入阶数n 2. 退出
正确否 N
Y 输入n
正确否 N
Y
输出n! 输出结果中
计算结果 “0的个数 结束 23
通信与信息工程学院软件实验报告
2、编程实现。
程序的关键源程序代码如下:
{
int Data[10000]={0}; intdigit,count=0; inti,j,r,k; Data[0]=1; Data[1]=1; digit=1;
for(i=1;i for(j=1;j Data[j]*=i; for(j=1;j { for(r=1;r Data[r+1]+=Data[r]/10; Data[r]=Data[r]; } } } } printf(\for(k=digit;k>0;k--) { printf(\ if(Data[k]==0) count++; } printf(\ printf(\结果中0的个数为:\ printf(\} 24 通信与信息工程学院软件实验报告 3、测试数据、测试结果、结果分析。 (1)欢迎界面: (2)输入n,计算阶乘及统计“0”个数: 1)当输入的n包含小数,输入数字“10.2”,其C程序运行结果如下: 2)当输入的n为负数,本次输入“-10”,其C程序运行结果如下: 25