hdu1042题讲解

来源:互联网 发布:淘宝客鹊桥怎么玩 编辑:程序博客网 时间:2024/04/30 10:52
 

 


/*
#include<stdio.h>
#include<string.h>
const int maxn=40000;//开得太大!!
int f[maxn];
int main()
{
    int i,j,n;
 while(scanf("%d",&n))
 {
      memset(f,0,sizeof(f));
   f[0]=1;
   for(i = 2; i<= n; i++)
   {//乘以i
         int c=0;
   for(j=0; j < maxn; j++)
   {
    int s=f[j]*i+c;
    f[j]=s%10000;
             c=s/10000;
   }
   }
   for(j = maxn-1; j>=0; j-- )if(f[j])break;//忽略前导0
   for(i = j; i >= 0; i-- )printf("%d",f[i]);
   printf("\n");
 }
 return 0;
}*/

 

/*求N!,由 N!=N*(N-1)!,所以求解N!的算法就是递推法。 当N值很小时可以直接用int型数据进行运算就
可以解决了,但当N值很大,比如N=10000或跟大时就没有办法用具体的数据类型来存放这样大的,因为他们的
为数都远远超过了int ,long甚至long long型的范围(如10000!有35660位)。为了解决所有数据类型都无法
存放这样一个庞大的数据,我想到了可以将这样一个数据一位一位的存放到一个字符数组或int型数组中,对其
每一位进行单独运算,然后将结果存放到另一个数组里,这样就解决了庞大数据的存放问题。但具体怎样对两个
都比较大的数的作乘法运算呢?这就要利用大整数的高精度运算。A,B都是位数比较多的大整数,现在要作A*B运
算。小学时我们作45*12是先把12中的2与45的个位5相乘,再把2与45的十位4相乘,然后同样再把12中的1与45中
的每一位从低到高依次相乘。在这里我们模拟也可以45*12,把A中每一位从低到高与B中的个位相乘,与后再与B
中的十位相乘,依次类推,最后把所有的结果对应相加就可以得到所要求的结果了。我们用a[100000]来存N!的结
果,如十进制数3478,存在a里面是:a[0]=4(记录数的长度),a[1]=8,a[2]=7,a[3]=4,a[4]=3;*///实现代码如下: */
      
#include<iostream>
using namespace std;
int a[40000];
int main()
{
 int N,i,j,pre;
 while (cin >> N)
 {   
  a[0] = 1;
  a[1] = 1;
  if (N==0||N==1)
  {    
   cout << 1 << endl;
   continue;  
  }         
  for (i = 2; i <= N; i++) 
  {   
   pre = 0;  
     for (j = 1; j <= a[0]; j++)
     {     
     a[j] *= i;
     a[j] += pre; //加上进位              
     pre = a[j] / 10; //进位值        
     a[j] %= 10; //本位  
     }           
   while (pre)//对末尾的进位进行存储  
   {     
    a[j] = pre % 10; 
    a[0] = j;              
    pre /= 10;            
    j++;  
   }  
  }         
  for (i = a[0]; i >= 1; i--)//输出
  {  
   cout << a[i];
  }       
  cout<<endl;
}     
 return 0;
}

 

 

 

 


 

原创粉丝点击