HDU-1042 N!
Posted 泡面小王子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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[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; }
以上是关于HDU-1042 N!的主要内容,如果未能解决你的问题,请参考以下文章