• (大数 万进制) 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

     

  • 相关阅读:
    TCP 监控工具 TCPMonitor
    程序员职业规划
    <转>eclipse如何修改dynamic web module version .
    JBoss部属和EJB调用-EJB3.0入门经典学习笔记(2)
    环境配置与JBoss安装-EJB3.0入门经典学习笔记(1)
    【EDA】PCBA丝印尺寸
    【Altium Designer】PCB如何用规则检查
    【Cadence】Gerber之二:钻孔文件设置与生成
    【生产】如何设计生产线
    【EMC】脉冲群Burst
  • 原文地址:https://www.cnblogs.com/Weixu-Liu/p/9164596.html
Copyright © 2020-2023  润新知