您的位置:首页 > 其它

hdu1018 Big Number

2015-08-21 23:13 232 查看
题目挺有意思。

计算n(<1e7)!的位数,一般我们会想如果知道这个数具体是多少就好办了。

然而n太大根本无法计算,其实把具体数值算出来对于求解本题是充分但非必要的条件。

我一开始考虑用把数值都用科学计数法表示出来,考虑两个浮点数相乘得到新的浮点数,更新10的幂就可以了。

然后实验过程中发现当n较大时运算的时间效率和结果的准确性均无法保证。

合理的解法是这样的。

我们假设n! = 10M, M为实数,那么显然n!的位数就等于M向下取整加一的值。

那么M = log(n!) = ∑log(i) (i ≤ n) (log指以10为底的对数)。

直观上我们可以这样理解,我们知道数值1000的位数为4这是因为log(1000) + 1 = 4,数值1001的位数为4因为(int)log(1001) + 1 = 4。

这里位数作为整数代表了原数字一部分性质。

我们推广位数到实数,使其具备原数的所有性质,即 log(i)。

那么由于对数的运算性质,数的相乘就变成了位数的相加。

结果即为所求。

http://acm.hdu.edu.cn/showproblem.php?pid=1018

#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

int n;

void solve(){
double M = 0;
for(int i = 1; i <= n; i++) M += log10(i);
int ans = (int)M;
printf("%d\n", ans + 1);
}

int main(){
int T;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
solve();
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: