码迷,mamicode.com
首页 > 其他好文 > 详细

HDU-1042 N!

时间:2016-09-12 20:43:12      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

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

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

int a[40000];

编程思想:(把计算结果的每一位上的数字保存到一个数组成员中,)例如将1234保存至数组中,结果为 a[0]=4 a[1]=3 a[2]=2 a[1]=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

 

HDU-1042 N!

标签:

原文地址:http://www.cnblogs.com/wft1990/p/5866061.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!