Pi sayısının virgülden sonraki 100 basamağını ekrana yazan algoritma

Katılım
8 Ocak 2014
Mesajlar
67
Makaleler
3
Yer
Manisa
Daha fazla  
Meslek
Öğrenci
Merhaba arkadaşlar. Programlama dersinde hocamız ibretlik bir soru sordu ve vizede çıkacağını söyledi. Soru Şöyle; "Pi sayısının virgülden sonraki 100 basamağını ekrana yazan algoritmayı yapınız" şeklinde. Bunu algoritmada yapabilmek için hangi yöntemi, metodu uygularım ? Yada herhangi bir öneriniz varsa paylaşın lütfen..
 
Merhaba, biraz kısa bir yoldan yaptım. Hazır kod -> CodePaste.NET -

ss.png

Pi sayısının devamını bir matematik sitesinden aldım. String değişkene yerleştirdim. Ardından bir String dizisi oluşturdum ve split("") metoduyla stringin tamamını diziye çevirdim. 100. eleman sorulmuş, noktadan önce 2 eleman olduğu için ekrana dizinin 102'nci elemanını yazdırdım. Takıldığın bir yer varsa sorabilirsin.
 
Hocan tam olarak neyi istiyor anlamadim. Acaba hem hesaplatip hem de yazdirmani yoksa hazir olan sayiyi sadece ekrana yazdirmani istiyor.
Pi sayısı - Vikipedi
Aşağida birçok pi formülü var. Burdan mesela newton formülünü seçebilirsin. Mesela newton formülünü ele alirsak: Öncelikle faktöriyel hesaplayan bir fonksiyon yazarsin veya yazildiğini varsayarsin. Daha sonra n=0 olacak şekilde bir integer , pi_sayisi=0 olacak şekilde bir double, hassaslik diye birde integer tanimlarsin. Hassasliği ne kadar büyük yaparsan pi sayisini o kadar iyi hesaplar. Neyse bir döngü yaratirsin bundan sonra döngüde n=0 dan hassasliğa kadar n=n+1 olacak şekilde pi=pi+(Newton Formülü). Burda hassaslik dizinin n=0 dan kaça kadar gideceği. Burdan sonra gerekli hassaslikda hesapladiktan sonra eğer c diliyse bu formatli yaziyi kullanirsin ve mesela printf("%101.100f",pi_sayisi) burda 101 karakter ayirip virgülden sonra 100 basamak yazacaği anlamina gelir.
 
Bu bir spigot algoritma örneği ve pi sayısının hesaplama teorilerini. Araştırmanı tavsiye ederim. Vize için daha vaktin varsa beraberde uğraşırız.
 
Son düzenleme:
John Machin 1706 da PI sayısını hesaplanabilmesi için şöyle bir formül geliştirmiştir,

f15dc3d39c473c4bd718e3a98145da0d.png


Yukarıda formüle göre bunu Taylor serilerinde açabiliriz, arccot(ark kotanjant) özel bir fonksiyon olduğu için, hazır kütüphaneleri kullanmayacağım. (3rd sympy),

pardon eklemeyi unutmuşum, aslında arctan1/5 >> arccot5 'e eşittir.

arccot(x,u) fonksiyonu için, ilk döngüyü elde edebilmek için 10^n(10 üssü n) yani 10'un katları olan (u değişkenini) bölerek başladık ve tekrar tekrar x^2'e böldük. Bu ilerleyiş 3,5,7,9... şekline kadar ta ki term değişkeni 0'a ulaştığında ve gerçek değeri 10^-n den küçük olduğunda döngüden çıkacaktır.

PHP:
def arccot(x, u):
    sum = ussu = u // x
    n = 3
    sign = -1
    while 1:
        ussu = ussu // (x*x)
        term = ussu // n
        if not term:
            break
        sum += sign * term
        sign = -sign
        n += 2
    return sum

Ana formülümüzü yerine yazacak bir pi fonksiyonu oluşturuyoruz, bu fonksiyon kullanıcıdan istenilen basamak kavramını öne çıkartır hayliyle programa dinamiklik kazandırır.

PHP:
def pi(basamak):
    u = 10**(basamak+10)
    pi = 4 * (4*arccot(5,u) - arccot(239,u))
    return pi // 10**10

print pi(100), 100 basamağını da yazdırır. Git

İyi çalışmalar..
 
Uyarı! Bu konu 10 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Yeni konular

Geri
Yukarı