HDU-1042 N!
2016-09-12 20:03
351 查看
首先明白这是大数问题,大数问题大多采用数组来实现。如何进位、求余等。比如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++代码:
View Code
对于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
相关文章推荐
- 理解金纳米晶体的光热转换效率
- commons-logging与log4j学习总结
- [verilog读书笔记]6.数据流建模
- 数据结构实验之链表六:有序链表的建立
- 第三周项目1-顺序表的基本运算
- C++——算法基础之排序——堆排序
- POI做题记录:第二届POI
- event对象的属性
- JZOJ 4771. 爬山
- ADL:社交网络分析与数据挖掘(DAY2)
- codeforces 459E
- 2016 ICPC 大连网络赛 HDU 5877 Weak Pair
- Cookie和Session区别(2)
- ArrayDeque集合的妙用
- [verilog读书笔记]5.门级建模
- [bzoj3729]Gty的游戏
- 组原 之 数字
- JavaScript学习笔记之DOM对象操作html元素
- POJ 2065 SETI(高斯消元解同余方程组)
- LeetCode 383:Ransom Note