• (大数 万进制) N! hdu1042


    N!

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)

    Total Submission(s): 88267    Accepted Submission(s): 26008

    Problem Description

    Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!

    Input

    One N in one line, process to the end of file.

    Output

    For each N, output N! in one line.

    Sample Input

    1

    2

    3

    Sample Output

    1

    2

    6

     (这个题用JAVA更好)

    用java:
    
     
    
    import java.math.BigInteger;
    
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
    
            Scanner in = new Scanner (System.in);
    
            int n;
    
            while(in.hasNextInt()) {
    
                n=in.nextInt();
    
                BigInteger a=BigInteger.ONE;
    
                for(int i=1;i<=n;i++)
    
                    a=a.multiply(BigInteger.valueOf(i));
    
                System.out.println(a);
    
            }
    
        }
    
    }
    View Code

    这个思路是从其他博客上看到的。。。

    思路:

    万进制:

    这题也让我有了点想法。我们经常用的进制就是2进制、8进制、10进制和16进制。何来“万进制”?世上本无,有人喊了也就有了。呵呵

            现在来谈谈自己对进制的一点不成熟的想法。计算机能“识别”0和1,人能识别0、1、2、3、4、5、6、7、8、9以及其多位组合。那么,

      为啥就单单有2、8、10、16这几个进制。我想并不止这几个,10进制是我们日常生活沿用来了的,难道来个5进制就不行?当然不是,不过

      一切以方便优先罢了!2进制是因为方便计算机识别才兴起的,5000年前应该不会有2进制!8进制和16进制又因何2进制有天然联系,所以

      也出现了用途,2^3=8、2^4=16(例:这在《数字逻辑》中关于编码方面有相关应用)。

             就题论题。再来谈谈1042的万进制。也以一个例子来说明:

             107924372*15=1618865580。

             ①上面的乘法如果运用10进制,很简单。

             ②万进制呢?

                   首先存数:a[0]=4372,a[1]=792,a[2]=1。107924372,从低位到高位每四位存到一个数组元素中。此时,总位数为3。

                   接着运算:a[0]*15=65580,所以进位为a[0]/10000=6,a[0]=a[0]%10000=5580。a[1]*15=11880,a[1]=a[1]+6=11886。

                                     进位为1,a[1]=1886。a[2]*15=15,a[2]=a[2]+1=16,进位为0。

                   输出:a[2],a[1],a[0]即为1618865580。要注意的是:如果a[2]=886,那么该如何输出?直接输出:168865580。显然不对,

                              正确的是16088655880。输出的原则是:最高位原样输出,其它位如果小于1000,则高位补0,一位一补。

    总之,高精度计算阶乘一般用万进制。

    #include<iostream>
    
    #include<iomanip>
    
    using namespace std;
    
    void fac(int n)
    
    {
    
    int a[10001];
    
    int carry=0,place=0,i,j;
    
    a[0]=1;
    
    for(i=1;i<=n;i++)
    
    {
    
    carry=0;
    
    for(j=0;j<=place;j++)
    
    {
    
    a[j]=a[j]*i+carry;
    
    carry=a[j]/10000;
    
    a[j]%=10000;
    
    }
    
    if(carry>0)
    
    {
    
    place++;
    
    a[place]=carry;
    
    }
    
    }
    
    cout<<a[place];
    
    for(i=place-1;i>=0;i--)
    
    cout<<setw(4)<<setfill('0')<<a[i];
    
    }
    
    int main()
    
    {
    
    int n;
    
    while(cin>>n)
    
    {
    
    fac(n);
    
    cout<<endl;
    
    }
    
    return 0;
    
    }
    View Code

     

  • 相关阅读:
    Count and Say leetcode
    Find Minimum in Rotated Sorted Array II leetcode
    Find Minimum in Rotated Sorted Array leetcode
    Search in Rotated Sorted Array II leetcode
    search in rotated sorted array leetcode
    Substring with Concatenation of All Words
    Subsets 子集系列问题 leetcode
    Sudoku Solver Backtracking
    Valid Sudoku leetcode
    《如何求解问题》-现代启发式方法
  • 原文地址:https://www.cnblogs.com/Weixu-Liu/p/9164596.html
Copyright © 2020-2023  润新知