大数据处理N!(21<N<2000)
输入: ????? 每行输入1个正整数n,(0<n<1000 000) 输出: ????? 对于每个n,输出n!的(十进制)位数 digit, 和最高位数firstNum。(n!约等于 firstNum * 10^[digit-1] ) 方法一: 利用数学库及相关知识。 ? ? 采用蛮力,根据定义,直接求解! ? ? 所谓n!的十进制位数,就是 log(n)+1,根据数学公式有:n!=1*2*3*.....*n; ??????????????????????????????????????????????????????????????????????????? lg(n!)=lg(2)+......lg(n); ? ? 第一位数等于 pow(10,lg(n!)的小数部分) 1 #include<iostream> 2 #include<math.h> 3 4 using namespace std; 5 int main(){ 6 7 int N; 8 cin>>N; 9 10 int firstNum=1; // should be 1-9 11 int digit=1; 12 13 double num=0.0,yushu=0.0; 14 15 for(int i=2;i<=N;i++) 16 { 17 num=num+log10(i); 18 } 19 20 digit=(int)num + 1; 21 22 yushu = num + 1 - digit; 23 firstNum=pow(10,yushu); 24 25 cout<< firstNum<< " " <<digit<<endl; 26 27 28 } ? 方法二: 把所有数字以字符形式存于数组中,然后倒序输出, 最关键点是要理解乘法的加法进位原理, 代码和测试结果如下 1 int main(){ 2 3 int N,digit=1,tmp=0,accu=0; 4 cin>>N; 5 6 int A[20000]; 7 8 A[0]=1; 9 10 for(int i=2;i<=N;i++) 11 { 12 accu=0; 13 tmp=0; 14 for(int j=0;j<digit;j++) 15 { 16 tmp=A[j]*i+accu; 17 A[j]=tmp%10; 18 accu=tmp/10; 19 } 20 while(accu!=0){ 21 A[digit]=accu%10; 22 accu/=10; 23 digit++; 24 } 25 } 26 27 digit--; 28 for(int i=digit; i>=0;i--) 29 cout<<A[i]; 30 31 cout<<endl; 32 33 } 测试结果 ?[[email?protected] Geeks]# ./a.out 5608941463976156518286253697920827223758251185210916864000000000000000000000000 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |