加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数据处理N!(21<N<2000)

发布时间:2020-12-14 03:47:01 所属栏目:大数据 来源:网络整理
导读:输入: ????? 每行输入1个正整数n,(0n1000 000) 输出: ????? 对于每个n,输出n!的(十进制)位数 digit, 和最高位数firstNum。(n!约等于 firstNum * 10^[digit-1] ) 方法一: 利用数学库及相关知识。 ? ? 采用蛮力,根据定义,直接求解! ? ? 所谓n!的

输入:

????? 每行输入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
100
9332621544394415268169923885626670049071596826438162146859296389521759999322991

5608941463976156518286253697920827223758251185210916864000000000000000000000000

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读