专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

高精度阶乘小程序

作者:佚名   来源:本站原创   点击数:  更新时间:2009年12月04日   【字体:

#include "Stdio.h"
#include "Conio.h"
int main(void)
{
    int nums[10000]; /*nums数组越大,且改变为长整型,可计算更大的阶乘,但改变数组类型会变慢*/
    int k,j;
    int n,i;
    printf("Please input a integer n:");
    scanf("%d",&n);
    for(i=1;i<=n-1;i++) nums[i]=0; /*这里有改进的余地*/
    nums[0]=1;
    k=0;
    for(i=2;i<=n;i++)
    {
        for(j=0;j<=k;j++) nums[j]=nums[j]*i;
        for(j=0;j<=k-1;j++)
        {
            nums[j+1]=nums[j+1]+(int)(nums[j]/10); /*进位计算*/
            nums[j]=nums[j]%10;
        }
        while(nums[k]>=10)
        {
            nums[k+1]=nums[k+1]+(int)(nums[k]/10); /*把结果数字的最高位分别放进nums数组中对应的位中,也可改进*/
            nums[k]=nums[k]%10;
            k++;
        }
    }
    printf("\nn!=");
    for(i=k;i>=0;i--) printf("%d",nums[i]); /*输出结果*/
    printf("\nk=%d",k+1);  /*k+1是最后结果的位数*/
    getch();
    return 0;
}

这个小程序根据整数乘法的原理,可突破计算机本身及编程语言存储类型大小限制,计算高精度的阶乘,如果nums数组大小为10000,大概可以计算3000的阶乘,即3000!,3000!计算的最后结果数字是9155位,其实这个程序还有很多可以改进的地方,初用C语言,没有把C语言的一些优势发挥出来。还有,我在VB里写好后运行测试发现和C语言比,在这算法一样的情况下,效率是天差地别的!
本程序在TC2.0下编译通过!
(还有,标颜色标得我手软了!)

关闭窗口

相关文章