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;

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

  • 相关阅读:
    6、redux源码解析
    5、redux源码解析
    4、redux源码解析
    3、redux码源
    2、redux源码探索
    1、redux源码探索
    Second Autoprefixer control comment was ignored. Autoprefixer applies control comment to whole block, not to next rules.
    Linux命令——whereis
    Linux命令——which
    Linux命令——tail
  • 原文地址:https://www.cnblogs.com/kagari/p/8799234.html
Copyright © 2011-2022 走看看