Жангирхан Шаку, 404 ArbTangent 6418
Арсен Жуматай,304 ArbTangent 6429
f1from decimal import Decimal, getcontext, ROUND_HALF_UPf1from decimal import Decimal, getcontext, ROUND_HALF_UP
2import sys2import sys
33
n4def compute_pi(precision):n4def compute_pi(prec):
5    getcontext().prec = precision + 55    getcontext().prec = prec + 5
6    coeff = 426880 * Decimal(10005).sqrt()6    C = 426880 * Decimal(10005).sqrt()
7    M = Decimal(1)7    M = Decimal(1)
8    L = Decimal(13591409)8    L = Decimal(13591409)
9    X = Decimal(1)9    X = Decimal(1)
10    K = Decimal(6)10    K = Decimal(6)
n11    total_sum = Ln11    S = L
12    for k in range(1, precision):12    for k in range(1, prec):
13        M = M * (K ** 3 - 16 * K) / k ** 313        M = M * (K ** 3 - 16 * K) / k ** 3
14        L += 54514013414        L += 545140134
15        X *= -26253741264076800015        X *= -262537412640768000
16        term = M * L / X16        term = M * L / X
n17        total_sum += termn17        S += term
18        if term == 0:18        if term == 0:
19            break19            break
20        K += 1220        K += 12
n21    return coeff / total_sumn21    pi = C / S
22    return pi
2223
n23def series_sine(x, num_terms):n24def sin_series(x, terms):
24    getcontext().prec += 225    getcontext().prec += 2
25    x_power = x26    x_power = x
26    factorial = Decimal(1)27    factorial = Decimal(1)
n27    sine_result = xn28    sin_x = x
28    sign = -129    sign = -1
n29    for i in range(3, num_terms * 2, 2):n30    for i in range(3, terms * 2, 2):
30        x_power *= x * x31        x_power *= x * x
31        factorial *= i * (i - 1)32        factorial *= i * (i - 1)
32        term = x_power / factorial33        term = x_power / factorial
n33        sine_result += sign * termn34        sin_x += sign * term
34        sign *= -135        sign *= -1
35        if term == 0:36        if term == 0:
36            break37            break
37    getcontext().prec -= 238    getcontext().prec -= 2
n38    return +sine_resultn39    return +sin_x
3940
n40def series_cosine(x, num_terms):n41def cos_series(x, terms):
41    getcontext().prec += 242    getcontext().prec += 2
42    x_power = Decimal(1)43    x_power = Decimal(1)
43    factorial = Decimal(1)44    factorial = Decimal(1)
n44    cosine_result = Decimal(1)n45    cos_x = Decimal(1)
45    sign = -146    sign = -1
n46    for i in range(2, num_terms * 2, 2):n47    for i in range(2, terms * 2, 2):
47        x_power *= x * x48        x_power *= x * x
48        factorial *= i * (i - 1)49        factorial *= i * (i - 1)
49        term = x_power / factorial50        term = x_power / factorial
n50        cosine_result += sign * termn51        cos_x += sign * term
51        sign *= -152        sign *= -1
52        if term == 0:53        if term == 0:
53            break54            break
54    getcontext().prec -= 255    getcontext().prec -= 2
n55    return +cosine_resultn56    return +cos_x
5657
n57def significant_digit_round(value, digits):n58def round_to_significant_digits(x, digits):
58    if value.is_zero():59    if x.is_zero():
59        return Decimal(0)60        return Decimal(0)
60    else:61    else:
n61        sign, digits_tuple, exponent = value.as_tuple()n62        sign, digits_tuple, exponent = x.as_tuple()
62        num_digits = len(digits_tuple)63        num_digits = len(digits_tuple)
63        adjusted_exponent = exponent + num_digits - digits64        adjusted_exponent = exponent + num_digits - digits
64        quantize_exp = Decimal('1e{}'.format(adjusted_exponent))65        quantize_exp = Decimal('1e{}'.format(adjusted_exponent))
n65        return value.quantize(quantize_exp, rounding=ROUND_HALF_UP)n66        return x.quantize(quantize_exp, rounding=ROUND_HALF_UP)
6667
n67def perform_calculations():n68def main():
68    angle_degrees = Decimal(sys.stdin.readline().strip())69    A = Decimal(sys.stdin.readline().strip())
69    precision = int(sys.stdin.readline().strip())70    E = int(sys.stdin.readline().strip())
70    if precision < 4 or precision > 1000:71    if E < 4 or E > 1000:
71        print('Precision must be between 4 and 1000')72        print('Precision must be between 4 and 1000')
72        return73        return
n73    getcontext().prec = precision + 10n74    getcontext().prec = E + 10
74    pi_result = compute_pi(getcontext().prec)75    pi = compute_pi(getcontext().prec)
75    angle_radians = angle_degrees * pi_result / Decimal(200)76    angle_rad = A * pi / Decimal(200)
76    terms_required = precision + 577    terms = E + 5
77    sine_value = series_sine(angle_radians, terms_required)78    sin_x = sin_series(angle_rad, terms)
78    cosine_value = series_cosine(angle_radians, terms_required)79    cos_x = cos_series(angle_rad, terms)
79    tangent_value = sine_value / cosine_value80    tan_x = sin_x / cos_x
80    tangent_value = significant_digit_round(tangent_value, precision)81    tan_x = round_to_significant_digits(tan_x, E)
81    tangent_string = '{0}'.format(tangent_value.normalize())82    tan_str = '{0}'.format(tan_x.normalize())
82    if '.' in tangent_string:83    if '.' in tan_str:
83        integer_part, fractional_part = tangent_string.split('.')84        integer_part, fractional_part = tan_str.split('.')
84        significant_digits = len(integer_part.lstrip('-') + fractional_p85        significant_digits = len(integer_part.lstrip('-') + fractional_p
>art)>art)
85    else:86    else:
n86        integer_part = tangent_string.lstrip('-')n87        integer_part = tan_str.lstrip('-')
87        significant_digits = len(integer_part)88        significant_digits = len(integer_part)
n88    if significant_digits < precision:n89    if significant_digits < E:
89        zeros_needed = precision - significant_digits90        zeros_needed = E - significant_digits
90        if '.' in tangent_string:91        if '.' in tan_str:
91            tangent_string += '0' * zeros_needed92            tan_str += '0' * zeros_needed
92        else:93        else:
n93            tangent_string += '.' + '0' * zeros_neededn94            tan_str += '.' + '0' * zeros_needed
94    print(tangent_string)95    print(tan_str)
95if __name__ == '__main__':96if __name__ == '__main__':
t96    perform_calculations()t97    main()
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op