zoukankan      html  css  js  c++  java
  • 大整数的阶乘

    阶乘:n!=n*(n-1)*(n-2)**2*1;
    计算机中,通经常使用int类型保存数值
    可是int取值范围有限( [-2147483648。2147483647])
    假如通过例如以下程序计算阶乘

    #include<stdio.h> 
    int Factorial(int n)
    {
        int i;
        if(n<=0)
        {
            return 0;
        }
        if(n==1)
        {
            return 1;
        }
        else
        {
            return n*Factorial(n-1);
        }
    }
    int main()
    {
        int n;
        printf("输入一个整数n(n>0):");
        scanf("%d",&n);
        printf("%d!=%d
    ",n,Factorial(n));
        return 0;
    }

    当计算17!

    时会出现

    这里写图片描写叙述

    显然,须要一个程序来计算大于17的阶乘
    思路:
    如果求12!

    。先求出11!

    =3991 6800;
    按位存入数组
    这里写图片描写叙述
    然后数组每一位乘以12。得
    这里写图片描写叙述
    进位
    这里写图片描写叙述

    按照这个思想,在不考虑计算机空间可性能的作用下得出程序:

    #include<stdio.h>
    #include<math.h>
    #include<stdlib.h>
    //计算进位 
    void Carry(int bit[],int pos)
    {
        int i,carray=0;
        //从0~pos位逐位检查是否进位 
        for(i=0;i<=pos;i++)
        {
            bit[i]+=carray;    //累加进位 
            if(bit[i]<=9)      //小于9不进位 
            {
                carray=0;
            }
            //大于9但不是最高位 
            else if(bit[i]>9&&i<pos)
            {
                carray=bit[i]/10; //保存进位数 
                bit[i]%=10;         //得到该位的一位数 
            }
            //大于9且是最高位 
            else if(bit[i]>9&&i>=pos)
            {
                while(bit[i]>9)  //循环向前进位 
                {
                    carray=bit[i]/10;    //计算进位值 
                    bit[i]%=10;         //当前的一位数 
                    i++;
                    bit[i]=carray;      //在下一位保存进位的值 
                }
            }
        }
    }
    int main()
    {
        int num,pos,digit,i,j,m,n;
        double sum=0;  //计算阶乘结果的位数 
        int *fact;      //保存阶乘结果的指针 
        printf("输入计算阶乘的数num=");
        scanf("%d",&num);       //输入计算阶乘的数
        //计算阶乘结果的位数 
        for(i=1;i<=num;i++)
        {
            sum+=log10(i);
        }
        digit=(int)sum+1;  //数据长度
        //分配保存 阶乘位数的内存 
        if(!(fact=(int *)malloc((digit+1)*sizeof(int))))
        {
            printf("分配内存失败!
    ");
            return 0;
        }
        //初始化数组 
        for(i=0;i<=digit;i++)
        {
            fact[i]=0;
        }
        fact[0]=1;  //设个位为1
        //将2~num逐个与原来的积相乘 
        for(i=2;i<=num;i++)
        {
            //查找最高位 
            for(j=digit;j>=0;j--)
            {
                if(fact[j]!=0)
                {
                    pos=j;  //记录最高位 
                    break;
                }
            }
            for(j=0;j<=pos;j++)
            {
                fact[j]*=i;  //每一位与i相乘 
            }
            Carry(fact,pos);  //进位处理 
        }
        //查找最高位 
        for(j=digit;j>=0;j--)
        {
            if(fact[j]!=0)
            {
                    pos=j;   //记录最高位 
                    break;
            }
        }
        m=0;  //统计输出位数 
        n=0;  //统计输出行数 
        printf("
    输出%d阶乘的结果(按随意键显示下一页):
    ",num);
        //输出计算结果 
        for(i=pos;i>=0;i--)
        {
            printf("%d",fact[i]);
            m++;
            if(m%4==0)    //每4个数字输出一个空格。方便阅读 
            {
                printf(" ");
            }
            if(m==40)  //每行最多40个数字 
            {
                printf("
    ");
                m=0;
                n++;
                if(n==10)  //输出10行暂停输出 
                {
                    getch();  //按随意键显示下一页 
                    printf("
    ");
                    n=0;
                }
            }
        }
        printf("
    
    ");
        printf("%d阶乘的结果共同拥有%d位。
    ",num,pos+1);
        return 0;
    } 

    执行程序。求17的阶乘得到

    这里写图片描写叙述

    如果求100的阶乘:

    这里写图片描写叙述

    代码下载位置:

    http://download.csdn.net/detail/u013553804/9496619
    http://pan.baidu.com/s/1pLxi435


    欢迎关注我的微信个人订阅号
    这里写图片描写叙述
    每天多学一点0.0

  • 相关阅读:
    Xshell 设置右键粘贴功能
    python中dict操作集合
    mac 设置网页字体
    博客收藏
    memcache 安装与简单使用
    mac安装homebrew
    Graphviz下载 使用
    jekyll 与hexo
    js 汉字排序
    初试gem
  • 原文地址:https://www.cnblogs.com/llguanli/p/8398988.html
Copyright © 2011-2022 走看看