hdu1018
来源:互联网 发布:山东外贸职业学院知乎 编辑:程序博客网 时间:2024/06/05 02:55
//hdu1018//Big Number//题意:计算阶乘的位数#include <iostream>#include <cstring>#include <cmath>using namespace std;const int MAXN = 1e7 + 7;int num[MAXN];const double PI = 3.1415926;int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int T; cin >> T; int n; while(T--){ cin >> n; //Case 1 // 任意一个正整数num的位数等于(int)log10(num) + 1 // 推导:假设 10^(x - 1) <= num < 10^x,那么显然num的位数为x位 // 取对数后得到:x - 1 <= log10(num) < x // 向下取整后得 log10(num) = x - 1,或向上取整后得log10(num) + 1 = x // 故 x = log10(num) - 1 // 即num的位数为log10(num) - 1 // 现假设 sum = 1 * 2 * 3 * … * n = n! // 则sum的位数为 (int)log10(sum) + 1 = (int)log10(1 * 2 * 3 * … * n) + 1 // = (int)log10(1) + (int)log10(2) + … + (int)log10(n) + 1 // 现在就算n取到1e7,都能很快求得其阶乘的位数 double ans = 0; for(int i = 1; i <= n; i++) ans += log10(i); cout << (int)ans + 1 << endl;//进1法,只要有小数部分就舍去加1 //Case 2 // 0ms //斯特林公式 //斯特林公式(Stirling's approximation)是一条用来取n的阶乘的近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特林公式十分好用,而且,即使在n很小的时候,斯特林公式的取值已经十分准确。 // n! ≈ sqrt(2πn) * (n/e)^n //而log10(n!)就可求出n!的位数, // log10(n!) = log10((n/e)^n * sqrt(2πn)) // = log10(n/e)^n) + log10(sqrt(2πn) // = nlog10(n) - nlog10(e) + 0.5 * log10(2πn) // = nlog10(n) - n(log(e)/log(10)) + 0.5 * log10(2πn) // = nlog10(n) - n/log(10) + 0.5 * log10(2πn) /* cout << (int)(n * log10(n) - n / log(10) + 0.5 * log10(2 * PI * n)) + 1 << endl; */ /* //Case 3:过不了的正确算法 // MLE //数组实现求大数阶乘及其位数,但若n取到1e7,其阶乘位数已达65657060位,非常大,而且内存很大,都有几百兆 memset(num, 0, sizeof(num)); int digit = 1; num[0] = 1; for(int i = 2; i <= n; i++){ int carry = 0;//进位标志 for(int j = 0; j < digit; j++){ int tmp = num[j] * i + carry; num[j] = tmp % 10; carry = tmp / 10; if(j == digit - 1 && carry) digit++; } } for(int i = digit - 1; i >= 0; i--) cout << num[i]; cout << endl; cout << digit << endl; */ }}
0 0
- hdu1018
- hdu1018
- hdu1018
- hdu1018
- hdu1018
- hdu1018
- hdu1018
- HDU1018
- hdu1018
- HDU1018
- hdu1018
- HDU1018
- HDU1018
- HDU1018
- hdu1018
- hdu1018
- hdu1018!【数学】
- HDU1018 BigNumber
- Guava cacha 机制及源码分析
- shiro AuthorizationInfo doGetAuthorizationInfo 授权调用
- java swing jfreechart
- Android自定义下拉刷新动画--仿百度外卖下拉刷新
- logcat命令参数中文详解
- hdu1018
- close和shutdown的区别
- Java基础—网络编程【OSI/RM TCP/IP】【网络通信三要素】【UDP传输 & TCP传输】【DNS域名解析】
- java设计模式24种之strategy-pattern设计模式
- 【转】 使用XHProf查找PHP性能瓶颈
- MPAndroidChart使用详解
- opencv边缘检测
- 【西瓜书】数据集分割与性能度量
- mysql单表递归查询(jpa[org.hibernate.QueryException: Space is not allowed afterQuery parameter prefix ':'])