高精度N的阶乘-N!
来源:互联网 发布:php 下载为电子文档 编辑:程序博客网 时间:2024/04/30 06:39
题目:输入一个正整数N(0<N<=30),求N!
代码:
#include<stdlib.h>#include<cstdio>#include<string>#include<iostream>using namespace std;int a[2005]={0};int main(){ int n,i,j,t=0,sum=0,b=0;//t represent carry bit cin>>n; a[1]=1; for(i=2;i<=n;i++) { for(j=1;j<=2000;j++)//enough bit to store the number { sum=a[j]*i+t;//each bit x i a[j]=sum%10;//finished bit number t=sum/10;//turn to the next bit } } if(n==1)cout<<"1"; else { for(j=2000;j>=1;j--) { if(a[j]!=0)b=1; if(b==1)cout<<a[j]; } } return 0;}/* 24 x 5 ---- 120 abc*/
说句实在的,这题我解决了很久,思路并没有像我想的那样快速而又灵活。
定义一个大数组a存储位数,这题很明显如果使用普通的递归函数调用或者用一个for循环暴力解决会使最终的数据超过int的32位整数范围。
那么思路这时就比较清晰:用数组存储每一位的位数,最后输出这个数组。
使用了两个for循环来模拟N!
第一个for循环:
for(i=2;i<=n;i++)
模拟与数i相乘。
第二个for循环:for(j=1;j<=2000;j++)
遍历数组中存储的每一位,在我第一次想到他的时候,问题在于取定j的范围,也就是最后结果的N!的位数。
这样去做太过麻烦,我做了两三次尝试无果,最后发现只需定义一个比较大足以容得下最大的N!的位数即可。
第二个for循环中的语句:
for(j=1;j<=2000;j++)//enough bit to store the number { sum=a[j]*i+t;//each bit x i a[j]=sum%10;//finished bit number t=sum/10;//turn to the next bit }
这里来说明几个变量的意义:1.sum 是位数和数i的乘积与进位数t之和 2.
a[j]
存储位数 3.t代表进位数sum=a[j]*i+t;
在阶乘的过程中,从小的位数到大的位数依次乘以此时的数i,sum存储此时第j位位数与i相乘之后再加上进位数t的和。a[j]=sum%10;
位数保留sum的个位数。t=sum/10;
进位数t=sum/10。
举个例子:24*5 先对24的个位4进行处理,4乘以5等于20,此时sum=20,留下的位数为0,进位数t=2;再对十位数2进行处理,2乘以5等于10,此时的sum=2x5+t=10+2=12,保留个位数字2为位数,进制数t=12/10=1;那么下一次执行的时候,sum=0+t=1,
a[j]=1
,t=0。实际上对数字位数的遍历操作已经结束了。
此时保证了在遍历数组元素(位数)的过程中,不会发生越界的现象,我在刚刚开始的时候对所有数组的元素赋值0,保证不会出现奇怪的错误和多位的情况。
最后输出的时候,用一个状态变量b,判断是否遇到了我们存储的“最大的”位数,是的话开始输出。
- 高精度N的阶乘-N!
- 高精度-n的阶乘
- 高精度计算-n的阶乘
- 高精度问题--n的阶乘
- N的阶乘大数据高精度写法
- C++ 高精度算法及N的阶乘
- N的阶乘--N!
- 九度OJ 1076:N的阶乘(高精度计算)
- HDU 1042 大数据、高精度,求n的阶乘
- 用PHP实现n的阶乘--高精度算法
- HDU 1042 N!(高精度计算阶乘)
- hdu1042 N! (高精度\大数阶乘)
- HDU 1042 N! 阶乘 高精度(java)
- HDU 1042 N!(高精度计算阶乘)
- n(n<100)的阶乘
- 用高精度方法计算n! ,并显示n!(阶乘)的值。
- 用高精度方法计算n! ,并显示n!(阶乘)的值。
- 大数阶乘-N的阶乘
- hdoj-2028-Lowest common multiple plus
- hdoj-2035-人见人爱a^b
- hdoj-2039-三角形
- 在页面中添加Token防止越权访问
- 列举一些有所帮助的blog和文章
- 高精度N的阶乘-N!
- 《算法竞赛入门经典》习题及反思
- hdoj-2053-Switch Game
- JS HashMap
- Oracle PLSQL通过SMTP发送E-MAIL邮件代码
- 深度优先搜索初尝试-DFS-LakeCounting POJ No.2386
- 使用fio测试磁盘I/O性能
- hdoj-2098-分拆素数和
- Redis和Memcache对比及选择