zoukankan      html  css  js  c++  java
  • 高精度N的阶乘-N!

    题目:输入一个正整数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,判断是否遇到了我们存储的“最大的”位数,是的话开始输出。

  • 相关阅读:
    JAVA动态代理
    图解 Tomcat 体系结构
    AdvancedDataGrid的使用
    You have an error in your SQL syntax; check the manual that corresponds...错误解决方案
    更新整站索引时失败,错误原因: [Incorrect integer value: `` for column `uptime` at row 1]
    dedecms转换v9 卡住的解决办法
    IIS 涉及到500和403或者404友好错误的设置!
    PHP Warning: date(): It is not safe to rely on the system's timezone settings
    不能读取记录;在 'MSysObjects' 上没有读取数据权限
    PHP5.3.5如何连接MSSql Server2005
  • 原文地址:https://www.cnblogs.com/qq952693358/p/5252513.html
Copyright © 2011-2022 走看看