本文主要是介绍uva 10916 Factstone Benchmark(打表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意是求 k ! <= 2 ^ n ,的最小k。
由于n比较大,大到 2 ^ 20 次方,所以 2 ^ 2 ^ 20比较难算,所以做一些基础的数学变换。
对不等式两边同时取log2,得:
log2(k ! ) <= log2(2 ^ n)= n,即:log2(1) + log2(2) + log2 (3) + log2(4) + ... + log2(k) <= n ,其中 n 为 2 ^1 , 2 ^2, 2 ^3 ...... 2 ^20。
然后打个表就行了。开始的时候用longlong,考虑到2的20次方应该装的下,结果不对,改用double。
代码:
#include <stdio.h>
#include <math.h>int ans[] = {3, 5, 8, 12, 20, 34, 57, 98, 170, 300, 536, 966, 1754, 3210, 5910, 10944, 20366, 38064, 71421, 134480, 254016};int main()
{/*freopen("out.txt", "w", stdout);double a = 2;double b = 0;for (int i = 1; i <= 21; i++){a *= 2;for (int j = 1; ; j++){b += log2(j);if (b > a){printf("%d, ", j - 1);b = 0;break;}}}*/int year;while (scanf("%d", &year) && year){printf("%d\n", ans[(year - 1960) / 10]);}return 0;
}
这篇关于uva 10916 Factstone Benchmark(打表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!