zoukankan      html  css  js  c++  java
  • HDU1042 n!

    问题链接HDU1042 n!

    问题描述参见上文。

    问题分析看似简单的问题,背后实际上有许多道理。

    阶乘值随着n的增大,增大的速度相当的快,是一个大整数。似乎这个题可以使用大整数类进行计算,然而类计算相对复杂,时间上溢出的可能性比较大。一般的整数计算,在计算机中是一种相对比较快的运算。

    用10000进制(万进制)来计算是一个有效的办法。10000进制的数可以放进数组中,每个元素放1位。人们通常使用10进制,采用逢10进1。采用10000进制的话,就是逢10000进1了。

    为什么采用10000进制而不采用其他的进制?原因还是有几点的,一是计算结果输出时相对比较方便;二是C语言或C++语言的整数类型在不同的编译运行环境中,其值范围是不一样的,一般整数类型int至少是16位的,其值>30000,采用10000进制是一种保守的做法。

    实际上,目前绝大多数计算机是64位的,使用更高的进制(例如100000000,亿进制)进行计算效率会更高。

    这个题计算的是阶乘,只需要单一的乘法运算,计算逻辑并不复杂,对于10000进制逻辑实现上不是问题。

    程序里的数组,下标小的放的是低位,下标大的放高位。

    程序说明(略)。

    AC的C语言程序如下:

    /* HDU1042 n! */
    
    #include <stdio.h>
    
    void factorial(int n)
    {
        int a[10000 + 1] = {1};
        int digits=1/*10000进制的位数*/, carry, i, j;
    
        for(i=2;i<=n;i++)
        {
            carry = 0;   //进位
    
            for(j=0; j<digits; j++)
            {
                a[j] = a[j] * i + carry;
                carry = a[j] / 10000;
                a[j] %= 10000;
            }
    
            if(carry>0)  // 最高位的进位
                a[digits++] = carry;
        }
    
        // 输出:高位原样输出,低位的高位补0
        printf("%d", a[digits-1]);
        for(i=digits-2; i>=0; i--)
            printf("%04d", a[i]);
        printf("
    ");
    }
    
    int main()
    {
        int n;
    
        while(scanf("%d", &n) != EOF)
            factorial(n);
    
        return 0;
    }


  • 相关阅读:
    ndk学习17: jni之Java调用C&C++
    ndk学习18: JNI之C&C++调用Java
    ndk学习15: IPC机制
    正向代理和反向代理
    java内存泄露与内存溢出
    权限管理及shiro框架
    异构信息网络
    基于遗传算法的试题组卷
    Java JNI机制
    Lucene及全文搜索实现原理
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564814.html
Copyright © 2011-2022 走看看