zoukankan      html  css  js  c++  java
  • HDU 1018 Big Number(斯特林公式)

    链接:传送门
    题意:求n!的位数
    思路:下面是三种情况,特别能体现知识面从窄到宽的巨大差别!


    1.直接暴力,每当阶乘超过1e9时计算位数,最后再计算一次位数

    /*************************************************************************
        > File Name: hdu1018t1.cpp
        > Author:    WArobot 
        > Blog:      http://www.cnblogs.com/WArobot/ 
        > Created Time: 2017年04月26日 星期三 20时46分26秒
     ************************************************************************/
    
    
    // 暴力的做法
    #include<bits/stdc++.h>
    using namespace std;
    
    typedef unsigned long long ull;
    ull t,n;
    const int maxn = 1e9;
    int main(){
    	while(cin>>t){
    		while(t--){
    			cin>>n;
    			int cnt = 0;
    			ull tmp = 1;
    			for(int i=1;i<=n;i++){
    				tmp *= i;
    				while(tmp>=maxn){
    					tmp /= 10;
    					cnt++;
    				}
    			}
    			while(tmp){
    				tmp /= 10;
    				cnt++;
    			}
    			printf("%d
    ",cnt);
    		}
    	}
    	return 0;
    }
    

    2.对于一个十进制数x,其位数为 log10(x) + 1 ,log10(n!) = log10(n) + log10(n-1) + ... + log10(1),也是暴力

    /*************************************************************************
        > File Name: hdu1018t2.cpp
        > Author:    WArobot 
        > Blog:      http://www.cnblogs.com/WArobot/ 
        > Created Time: 2017年04月26日 星期三 21时09分14秒
     ************************************************************************/
    
    // 一个十进制数位数的计算方法 log10(x) + 1
    #include<bits/stdc++.h>
    using namespace std;
    
    int t,n;
    int main(){
    	while(cin>>t){
    		while(t--){
    			cin>>n;
    			double ans = 0;
    			for(int i=1;i<=n;i++){
    				ans += log10(i);
    			}
    			cout<<(long long)ans + 1<<endl;
    		}
    	}
    	return 0;
    }
    

    3.根据斯特林公式可知 直接对后面的数求对数即可。

    /*************************************************************************
        > File Name: hdu1018t3.cpp
        > Author:    WArobot 
        > Blog:      http://www.cnblogs.com/WArobot/ 
        > Created Time: 2017年04月26日 星期三 22时22分25秒
     ************************************************************************/
    
    #include<bits/stdc++.h>
    using namespace std;
    #define PI 3.1415926535
    
    int t,n;
    int main(){
    	scanf("%d",&t);
    	while(t--){
    		scanf("%d",&n);
    		long long ans = (long long)( log10(sqrt(2*PI*n)) + n*log10(n/exp(1))  )+1;
    		cout<<ans<<"
    ";
    	}
    	return 0;
    }
    

  • 相关阅读:
    C# Arrays
    C# 类 (12)
    C# 类 (11)
    C# 类 (10)
    常用的HDFS操作
    Java StringTokenizer 类使用方法
    常用HBase操作
    常用Linux命令
    彻底关闭Windows10的更新
    如何将百度坐标转换为国家2000(或WGS84)坐标系?
  • 原文地址:https://www.cnblogs.com/WArobot/p/6771442.html
Copyright © 2011-2022 走看看