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

    int n;
        long ans=1;
        while(scanf("%d",&n)!=EOF)
            {
        ans=1;
        while(n>1)
                ans*=n--;
        printf("%ld
    ",ans);
        }
        return 0;

    普通阶乘只需直接循环相乘就行,但是因为c语言变量表示范围问题。导致阶乘数字过大无法表示。

    char: 1字节(8位)int8_t
    int: 4字节 (32位,取值范围 -2^31 ~ 2^31-1)
    unsigned int : 4字节 (32位,取值范围 0 ~ 2^32-1)
    long: 4字节 (32位,取值范围 -2^31 ~ 2^31-1)
    unsigned long : 4字节 (32位,取值范围 0 ~ 2^32-1)
    long long : 8字节(64位,取值范围 -2^63 ~ 2^63-1)

    所以阶乘过大时应换一种表示方法。这里使用数组保存。数组每一位保存一位十进制数据,依次从各位到最高位上数字与下一次乘法数字相乘,保留最低位,其他位进位,最终达到表示大数。

    举例:

    1!=[1]=1

    2!=[2]=2

    3!=[6]=6

    4!=[0,24]=[2,4]=2*10^1+4

    5!=[10,20]=[1,2,0]

    ......

    int a[10000],n,digit,i,j,temp;
        while(scanf("%d",&n)!=EOF)
        {
        a[0]=1,digit=1;
        for(i=2;i<=n;i++)
        {
        int num=0;
        for(j=0;j<digit;j++)
            {
            temp=a[j]*i+num;
            a[j]=temp%10;
            num=temp/10;
            }
        while(num)
            {
            a[digit++]=num%10;
            num=num/10;
            }
        }
        for(i=digit-1;i>=0;i--)
                printf("%d",a[i]);
            printf("
    ");
            }
            return 0;

    这种用数组存储数字的做法在大数存储中十分常见,提到存储就得说说数据结构。数据结构果然是与算法密不可分的。

  • 相关阅读:
    我是来讲笑话的
    dom4j读取xml
    Mysql常用命令
    如何快速开发小型系统
    Spring aop的实现原理
    Spring IOC容器解析及实现原理
    如何编写更棒的代码
    Git使用教程
    关于程序员吃青春饭问题之探讨
    如何自学编程
  • 原文地址:https://www.cnblogs.com/kagari/p/8799234.html
Copyright © 2011-2022 走看看