大数的阶乘---可求1000!的值,位数,还可求数中2的个数(1个数组 简单易理解)
2013-03-12 19:00
239 查看
/* 求1000!的值,值中2的个数,阶乘值的位数 大数的阶乘 分析:阶乘的定义就是n! = (n-1)!*n,但是有基本的初始条件的,即0! = 1 因此1! = 1*0! = 1 * 1 = 1; 2! = 2*1! = 2 * 1 = 2; 依次类推,但是当n足够大时,整型根本无法装下n的阶乘, 如果用C++语言的整型或浮点型变量来实现的话,根本不可能,会产生溢出 阶乘也无非是乘法和加法罢了,如4!= 24; 可以用数组来存各位,数组的起始长度是1,每当遇到超过长度时,就自加1, 不过这里要稍微处理下的,以倒过来存,以便做乘法的,可以这样来存。 4! 存 4 2 此时4!的长度为24的长度2 5! = 5 * 4!,可以用5去乘以4等于20,20取余20%10=0,如果大于10则需向高位进位5*4/10,下一位的结果就等于下一位乘以5*2加上刚才的进位得12,12对10余2保存,12整除10得1 最后移位反过来存0 2 1 5! 存 0 2 1 此时5!的长度为120的长度3 6! =6*5! 6*0=0 在对10取余的0 保存,无进位,然后6*2=12,12对10整除=1作为进位数,12对10取余=2保存,最后6*1+1(上一次的进位)=7保存 最后保存0 2 7 6! 存 0 2 7 此时5!的长度为720的长度3 ....依次类推 1000!=1000*999! */ #include <iostream> using namespace std; #define N 1000 // 所需求的N的阶乘 static int a[N*3]; // 保存阶乘的各位,从a[1]开始存储,方向存放阶乘值,输出时倒序输出 int main() { int i,j; //循环控制变量 int len = 1; //阶乘值的位数 int tem,carry; //tem为乘积加进位值,carry为上次乘积的进位值 int count_2=0;//记录阶乘值中2的个数 a[1] = 1; //1的阶乘 for (i = 2;i<=N;i++) //求阶乘的方法 { carry = 0; //新一轮乘积要将进位重新置0 for (j=1;j<=len;j++) { tem = a[j]*i +carry; a[j] = tem%10; //获取乘积余数存放到对应数组位置 carry = tem/10; //获取乘积对10的整除值作为下一次计算tem计算的进位值 if (j==len&&carry!=0) //当乘到最后1位(乘积+进位数)超过10,即当乘到最后还有进位时,阶乘值的位数增1 { len++; } } } for (i = len;i>=1;i--) //输出各位,逆序输出 { cout<<a[i]; if(a[i]==2) count_2++; } cout<<endl; cout<<N<<"的阶乘共 "<<len<<"位"<<endl; cout<<N<<"!中2的个数为:"<<count_2<<endl; return 0; }
相关文章推荐
- 后缀数组:倍增法和DC3的简单理解
- java新手如何简单的理解java数组中冒泡排序法是怎么实现排序的
- 对指针数组,数组指针,函数指针数组,函数数组指针的一些简单理解
- C问题---1000的阶乘的位数
- 一维数组的简单理解
- 1000!(1000的阶乘)中有几个2-----三个数组
- 线性结构 -- 连续存储(数组), 1个简单的c语言代码实现.
- 线性结构 -- 连续存储(数组), 1个简单的c语言代码实现.
- 数组去重的四种方法,简单好理解
- 我的编程学习日志(3)--教你简单的理解数组和指针(对指针概念还模糊的看过来)
- 51nod 1435 位数阶乘 (简单题)
- 1000 的阶乘有几位数?
- 我的编程学习日志(3)--教你简单的理解数组和指针(对指针概念还模糊的看过来)
- 1000 的阶乘有几位数? - 后续, 求解
- 对kmp算法next数组的一些简单理解
- 函数指针与函数指针数组的简单理解以及vector
- 指针数组与数组指针(C++,简单理解)
- 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少.请编程实现。提示:可声明1个数组 按照规律为每1个元素赋值.
- PHP中通过加号合并数组的一个简单方法分享
- C#lesson_3 数组的简单运用