zoukankan      html  css  js  c++  java
  • HDU-1042 N!

    首先明白这是大数问题,大数问题大多采用数组来实现。如何进位、求余等。比如1047 (Integer Inquiry);

    对于1042问题 计算10000以内数的阶乘,因为10000的阶乘达到35660位。所以普通的做法是无法实现的。所以我们只能定义一个40000个成员的数组就可以啦。

    int a[40000];

    编程思想:(把计算结果的每一位上的数字保存到一个数组成员中,)例如将1234保存至数组中,结果为 a[0]=4 a[1]=3 a[2]=2 a[3]=1, 一个int 型数据存放一个小于10的数绝对可以。就是处理起来有点麻烦。把整个数组看成一个数字,这个数字与一个数相乘:需要每一位都与这个乘数相乘并且还需加上前一位的进位。(int 型足以  因为乘数和一个小于十的数相乘不会大于100000,再加上进位的int型数据,也不会有问题)

    运算方法:乘积的个位是当前位上表示的数字,10以上的数需要进位。

    int temp = a[x] *乘数 + 进位;// temp 代表临时结果

    然后把temp个位的数取出来放到数组中

    a[x]=temp%10;

    接下来计算进位:

    进位 =temp /10;

    这样依次计算就可以求出整个数组,特别注意最后可能有进位,然后依次将其拆分完放到相应的位置上去为止。

    下图是C++代码:

    #include<iostream>
    using namespace std;
    int main()
    {
        int n;
        int a[40000];
        while(cin>>n)
        {
            if(n>10000&&n<0)
              break;
            a[0]=1;
            int digit=1;
            int temp,s=0;
            for(int i=1;i<=n;i++)
            {
                for(int j=0;j<digit;j++)
                {
                    temp=a[j]*i+s;
                    a[j]=temp%10;
                    s=temp/10;
                }
                while(s)
                {
                    a[digit++]=s%10;
                    s/=10;
                }
            }
            for(int k=digit;k>=1;k--)
            {
                cout<<a[k-1];
            }
            cout<<endl;  
            
        }
        return 0;
    }
    View Code
  • 相关阅读:
    vue项目中引用spreadjs方法
    使用Element的table合并单元格的问题(合并行)
    卸载mysql
    mac 下安装mySQL
    react中界面跳转 A界面跳B界面,返回A界面,A界面状态保持不变 localStorage方法
    react点击弹出带出值和点击跳转页面带出值
    ajax优缺点
    vue项目console.log报错
    性能优化
    对象生命周期
  • 原文地址:https://www.cnblogs.com/wft1990/p/5866061.html
Copyright © 2011-2022 走看看