uva 10916 Factstone Benchmark(打表)
2014-07-04 18:48
211 查看
题意是求 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。
代码:
由于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
- UVa 10916 - Factstone Benchmark
- UVa 10916 - Factstone Benchmark
- UVA - 10916 Factstone Benchmark
- Uva 10916 - Factstone Benchmark
- UVA 10916 Factstone Benchmark
- UVa 10916 Factstone Benchmark
- UVA 10916 - Factstone Benchmark
- UVA - 10916 Factstone Benchmark
- uva 10916 Factstone Benchmark
- UVA 10916-Factstone Benchmark
- uva 10916 Factstone Benchmark(对数函数的活用)
- UVA10916- Factstone Benchmark
- UVa 10916 Factstone Benchmark (数学&阶乘的处理技巧)
- UVA-10916 Factstone Benchmark
- uva 10916 Factstone Benchmark
- UVa 10916 - Factstone Benchmark
- uva-10916 - Factstone Benchmark
- Uva 10916 Factstone Benchmark
- UVa 10916 - Factstone Benchmark