#include <stdio.h>
typedef unsigned int Uint;
#define N 100
#define DP 15
//RADIX == 10^LOG
#define LOG 1
#define RADIX 10
typedef Uint Liczba[ N+ 1 ] ;
void pisz( Liczba a ) { Uint i;
for ( i
= 1 ; i
<= DP
&& ! a
[ i
] ; i
++ ) printf ( "%*s" , LOG
, "" ) ; for ( i
++; i
<= DP
; i
++ ) printf ( "%0*u" , LOG
, a
[ i
] ) ; for ( ; i
<= N
; i
++ ) printf ( "%0*u" , LOG
, a
[ i
] ) ; }
void plus( Liczba a, Liczba b) { // a[]:=a[]+b[]
for ( Uint c= 0 , i= N; i> 0 ; i-- ) {
c += a[ i] + b[ i] ;
a[ i] = c % RADIX;
c /= RADIX; } }
void minus( Liczba a, Liczba b ) { // a[]:=a[]-b[]
for ( Uint c= 0 , i= N; i> 0 ; i-- ) {
c += b[ i] ;
if ( a[ i] < c ) {
a[ i] = RADIX + a[ i] - c; c= 1 ; }
else {
a[ i] -= c; c= 0 ; } } }
void razyU( Liczba a, Uint b ) { // a[]:=a[] * b
for ( Uint c= 0 , i= N; i> 0 ; i-- ) {
c += a[ i] * b;
a[ i] = c % RADIX;
c /= RADIX; } }
int podzielU( Liczba w, Liczba a, Uint b ) { // w[]:=a[] / b
Uint z= 0 ; // return w[] != 0
for ( Uint c= 0 , i= 1 ; i<= N; i++ ) {
c = c* RADIX+ a[ i] ;
w[ i] = c/ b % RADIX; if ( w[ i] ) z= 1 ;
c = c - w[ i] * b; }
return z; }
void wstawU( Liczba a, Uint b ) { // a[]:= b
Uint i;
for ( i= 0 ; i<= N; i++ ) a[ i] = 0 ;
i= DP;
while ( b ) {
a[ i-- ] = b% RADIX; b /= RADIX; } }
void atg( Liczba a, Uint x ) { // a[]:= atan( 1/x )
Liczba px;
wstawU( px, 1 ) ; podzielU( px, px, x ) ;
wstawU( a, 0 ) ; plusU ( a, px ) ;
for ( Uint n= 1 ; ; n++ ) {
Liczba b;
podzielU( w, w, x* x ) ;
if ( ! podzielU( b, w, 2 * n + 1 ) )
break ;
if ( n & 1 ) plus( a, b ) ;
else minus( a, b ) ; } }
int main( void ) {
Liczba a;
atg
( a
, 5 ) ; pisz
( a
) ; puts ( "" ) ; return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp0eXBlZGVmIHVuc2lnbmVkIGludCBVaW50OwojZGVmaW5lIE4gMTAwCiNkZWZpbmUgRFAgMTUKLy9SQURJWCA9PSAxMF5MT0cKI2RlZmluZSBMT0cgMQojZGVmaW5lIFJBRElYIDEwCnR5cGVkZWYgVWludCBMaWN6YmFbTisxXTsKIAp2b2lkIHBpc3ooIExpY3piYSBhICl7IFVpbnQgaTsKCWZvciggaT0xOyBpPD1EUCAmJiAhYVtpXTsgaSsrICkgcHJpbnRmKCIlKnMiLCBMT0csIiIpOwoJcHJpbnRmKCIlKnUiLCBMT0csIGFbaV0pOwoJZm9yKCBpKys7IGk8PURQOyBpKysgKSBwcmludGYoIiUwKnUiLCBMT0csIGFbaV0pOwoJcHV0Y2hhcignLicpOwoJZm9yKCAgICA7IGk8PU47IGkrKyApIHByaW50ZigiJTAqdSIsIExPRywgYVtpXSk7IH0KCQkKdm9pZCBwbHVzKCBMaWN6YmEgYSwgTGljemJhIGIpeyAgICAgICAgICAgICAgICAgIC8vIGFbXTo9YVtdK2JbXQoJZm9yKCBVaW50IGM9MCwgaT1OOyBpPjA7IGktLSApewoJCWMgKz0gYVtpXStiW2ldOwoJCWFbaV0gPSBjICUgUkFESVg7CgkJYyAvPSBSQURJWDt9fQoKdm9pZCBtaW51cyggTGljemJhIGEsIExpY3piYSBiICkgeyAgICAgICAgICAgICAgIC8vIGFbXTo9YVtdLWJbXQoJZm9yKCBVaW50IGM9MCwgaT1OOyBpPjA7IGktLSApewoJCWMgKz0gYltpXTsKCQlpZiggYVtpXTxjICl7CgkJCWFbaV0gPSBSQURJWCArIGFbaV0gLSBjOyBjPTE7IH0KCQllbHNlIHsKCQkJYVtpXSAtPSBjOyBjPTA7IH19fQoKdm9pZCByYXp5VSggTGljemJhIGEsIFVpbnQgYiApIHsgICAgICAgICAgICAgICAgIC8vIGFbXTo9YVtdICogYgoJZm9yKCBVaW50IGM9MCxpPU47IGk+MDsgaS0tICl7CgkJYyArPSBhW2ldKmI7CgkJYVtpXT0gYyAlIFJBRElYOwoJCWMgLz0gUkFESVg7IH19CgppbnQgcG9kemllbFUoIExpY3piYSB3LCBMaWN6YmEgYSwgVWludCBiICkgeyAgICAgLy8gd1tdOj1hW10gLyBiCglVaW50IHo9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB3W10gIT0gMAoJZm9yKCBVaW50IGM9MCwgaT0xOyBpPD1OOyBpKysgKSB7CgkJYyA9IGMqUkFESVgrYVtpXTsKCQl3W2ldPSBjL2IgJSBSQURJWDsgaWYoIHdbaV0gKSB6PTE7CgkJYyA9IGMgLSB3W2ldKmI7fQoJcmV0dXJuIHo7fQoKdm9pZCB3c3Rhd1UoIExpY3piYSBhLCBVaW50IGIgKSB7ICAgICAgICAgICAgICAgIC8vIGFbXTo9IGIKCVVpbnQgaTsKCWZvciggaT0wOyBpPD1OOyBpKysgKSBhW2ldPTA7CglpPURQOwoJd2hpbGUoIGIgKSB7CgkJYVtpLS1dID0gYiVSQURJWDsgYiAvPSBSQURJWDsgfX0KCnZvaWQgYXRnKCBMaWN6YmEgYSwgVWludCB4ICkgeyAgICAgICAgICAgICAgICAgIC8vIGFbXTo9IGF0YW4oIDEveCApCglMaWN6YmEgcHg7Cgl3c3Rhd1UoIHB4LCAxICk7IHBvZHppZWxVKCBweCwgcHgsIHggKTsKCXdzdGF3VSggYSwgIDAgKTsgcGx1c1UgICAoIGEsIHB4ICk7Cglmb3IoIFVpbnQgbj0xOyAgIDsgbisrKXsKCQlMaWN6YmEgYjsKCQlwb2R6aWVsVSggdywgdywgeCp4ICk7CgkJaWYoICEgcG9kemllbFUoIGIsIHcsIDIqbiArIDEgKSApCgkJCWJyZWFrOwoJCWlmKCBuICYgMSApIHBsdXMoIGEsIGIgKTsKCQllbHNlIG1pbnVzKCBhLCBiICk7fX0JICAgICAgICAgICAgCgppbnQgbWFpbih2b2lkKSB7CglMaWN6YmEgYTsKCWF0ZyggYSwgNSApO3Bpc3ooYSk7IHB1dHMoIiIpOwoJcHJpbnRmKCJcbiUwLjE0ZlxuIiwgYXRhbigxLzUuMCApKTsKCXJldHVybiAwOwp9Cg==