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
  • 相关阅读:
    Array方面Js底层代码学习记录
    DOM 节点
    跨域
    狂雨cms代码审计:后台文件包含getshell
    在PHP一句话木马使用过程中的种种坑点分析
    记对某CMS的一次代码审计
    通达OA任意文件上传并利用文件包含导致远程代码执行漏洞分析
    DedeCMS V5.7 SP2后台存在代码执行漏洞
    zzzcms(php) v1.7.5 前台SQL注入及其他
    权限维持及后门持久化技巧总结
  • 原文地址:https://www.cnblogs.com/wft1990/p/5866061.html
Copyright © 2011-2022 走看看