POJ 1423 Big Number

来源:互联网 发布:万能搞笑证件制作软件 编辑:程序博客网 时间:2024/05/22 11:43

朴素方法求解会超时,所以采用斯特林近似方法求解; n!近似等于sqrt(2*PI*n)*(n/e)^n。然后取对数后上取整。

// codingEx.cpp : Defines the entry point for the console application.
// author: momogary1204


//#include "stdafx.h"
#include<iostream>
#include<cmath>
#include<vector>


using namespace std;


const double PI = 3.14159;
const double e = exp(1);


double cal(const double& number){
return 0.5*log10(2 * PI*number) + number*log10(number / e);
}


//const int MAX_LEN = 50;
//const int MAX_CASE = 100;


int main()
{
double number = 0;
int testcase = 0;
//double sum = 0;
vector<int> result;


cin >> testcase;


while (testcase--){
cin >> number;

if (number == 0 || number == 1){
result.push_back(1);
continue;
}

                 //朴素方法
//sum = 0;
//for (double i = 1; i <= number; i++){
// sum += log10(i);
//}
result.push_back(ceil(cal(number)));//斯特林近似求解
}
for (int i = 0; i < result.size(); i++){
cout << result[i] << endl;
}
//cin >> number;
return 0;
}






0 0