UVA_10169
这个题目明显可以预处理出结果然后再随用随查。计算的公式并不难推导,在计算0的个数的时候采用一个X=10^(log10(X))这样的转化,这样便只需计算出-log10(X)的整数部分即可。
此外,需要注意的是涉及整数乘法的地方一定要避免溢出,如果中间结果会超过int的范围可以在计算之前根据需要强制转型成double或者long long。
#include#include #include #define MAXD 1000010 double f[MAXD]; int d[MAXD]; void prepare() { int i, j, k; double p1 = 1, p2 = 0; for(i = 1; i < 1000000; i ++) { p1 = p1 * ((double)i * i + i - 1) / ((double)i * i + i); p2 += log10((double)i * i + i); f[i] = 1 - p1; d[i] = (int)(p2 - fmod(p2, 1) + 0.5); } } int main() { int n; prepare(); while(scanf("%d", &n) == 1) { if(n == 0) printf("0.000000 0\n"); else printf("%.6lf %d\n", f[n], d[n]); } return 0; }