Logarithms (数学)

本文探讨了数值计算中的对数函数,通过特定公式求解对数表达式的最小可能值及对应变量x的值,涉及数学公式应用与计算技巧。
 Logarithms
Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu

Description

Download as PDF

Problem A
Logarithms 
Input: 
Standard Input

Output: Standard Output

 

From time immemorial different series has been an integrated part of mathematics. Series is very important for finding values of many important functions such as sin(x), ex, ln(x) etc. The well known formula for finding the value of ln(1-x) is shown below:

, Here |x|<1.

However as this formula is true when x is less than 1, a modification is needed to find the formula for any integer. For any integer n the following relationship is true:

 

,

                  Here |x|<1 and it is a real number, n is a positive integer and L is a non-negative integer.

 

But for a given integer n, L can have more than one value. Your job is to find the smallest possible value of L and for that L find the value of x.

 

Input

The input file contains around 10000 line of input. Each line contains a single integer n (0<n<231-1). Input is terminated by a line containing a zero.

 

Output

For each line of input produce one line of output. This line contains one integer followed by one floating point number. The integer number denotes the smallest possible value of L and floating-point number denotes the corresponding value of x. This floating-point number should have eight digits after the decimal point.

 

Sample Input                              Output for Sample Input

6

7

300

0

2 0.18798830

2 0.05265302

6 0.25637435

 


Problemsetter: Shahriar Manzoor

Special Thanks: Arifuzzaman Arif, Sohel Hafiz, Derek Kisman

 由题中两个formula可以得到:

ln(n) - ln(1 - x) = L.注意到fabs(x) < 1,得到0 < ln(1 - x) < ln2,所以ln(n) - ln2 < L,于是L取[ln(n) - ln2  + 1]即可([x]代表取小于x的最大整数)

AC CODE

//Memory: 0 KB		Time: 24 MS
//Language: ANSI C 4.1.2		Result: Accepted

#include <stdio.h>
#include <math.h>

int main()
{
    int n, L;
    double x;
    const double u = log(2);
    while(scanf("%d", &n) && n)
    {
       double m = log(n);
       L = ceil(m - u);
       x = 1- exp(m - L);
       printf("%d %.8lf\n", L, x);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值