Beyler, sonunda bir yaratıcılık unsuru gösterin! Mesele pi sayısını bulmak için bu programı kullanmak değil, programın bunu nasıl yaptığını deşifre etmektir. Konuyu okuduk: "... beyni eğitmek için sorunlar ...". Bu program "Fun with C" serisindendir. C'deki en anlaşılmaz ve gizemli algoritmaları derlemek için böyle bir rekabet var. Kaynak kodu orada, sonuç orada ve çalışma prensibinin çözülmesi gerekiyor. Algoritmanın kendisi çözülmesi gereken problemdir. "hacklenmesi" gerekir. Bunu yapmak için beyninizi "kırmanız" gerekir.
C-4>> : Сам алгоритм - это и ест задача для решения. Его надо "взломать". Для этого требуется "поломать" свой мозг.
Bunun bir sorun olduğundan şüphelendim ...
Tamam hadi görelim.
int a =10000, b , c =2800, d , e , f [2801], g ;int main (void){for(; b - c ;) f [ b ++]= a /5;for(; d =0, g = c *2; c -=14,printf("%.4d", e + d / a ), e = d % a )for( b = c ; d += f [ b ]* a , f [ b ]= d %-- g , d /= g --,-- b ; d *= b );}
İlk döngü ile başa çıkmak
for(; b - c ;) f [ b ++]= a /5;
Döngü, b - c ifadesi doğru olarak değerlendirildiği sürece yürütülür. C'de doğru olan nedir? Diyelim ki, herhangi biri sıfır değildir. Bu, b'yi sıfırdan artırma ve f[] dizisini doldurma döngüsünün b, c'ye eşit olana kadar gerçekleştirildiği anlamına gelir, yani. 2800'e kadar. f[] dizisi aynı 10000/5 = 2000 sayılarıyla doldurulur.
Döngü, b - c = true olana kadar yürütülür. C'de doğru olan nedir? Diyelim ki, herhangi biri sıfır değildir. Bu, b'yi sıfırdan artırma ve f[] dizisini doldurma döngüsünün b, c'ye eşit olana kadar gerçekleştirildiği anlamına gelir, yani. 2800'e kadar. f[] dizisi aynı 10000/5 = 2000 sayılarıyla doldurulur.
for( ; g = c *2; ) { d =0; for( b = c ;-- b ; d *= b ) { d += f [ b ] * a ; g --; f [ b ] = d % g; d /= g ; g --; } c -=14; printf("%.4d", e + d / a ); e = d % a; }
Burada sıra özellikle önemlidir. Bak, henüz yalan söylemedim mi? Sonra daha ileri gideceğiz.
// aslında için(; g = c *2;) bu baskıda çok daha iyi görünecek:için( g = c *2;g != 0 ; )
Ancak genel olarak, bazı Yunanlılar Pi \u003d 66/21
Yunan muhtemelen 22/7 (66/21 ile aynıdır) konuşuyordu.
Daha doğrusu 355/113 olacaktır (doğruluk - 3*10^(-7) ).
Bir sonraki en iyi kesir zaten 103993 / 33102'dir (sıralama doğruluğu 6*10^(-10) ).
2 Richie: Eh, VB'yi de bitirmen gerekiyordu. Peki, o zaman Metaquotes ile mi karşılaşıyorsunuz?
iyi eğlenceler
iyi eğlenceler
Mischek , biz burada eski yüksek lisans öğrencileriyiz, 11. sınıf için değil 8. sınıf için problem çözüyoruz :)
Fakir çocuklar :(
Bunun bir sorun olduğundan şüphelendim ...
Tamam hadi görelim.
İlk döngü ile başa çıkmak
Döngü, b - c ifadesi doğru olarak değerlendirildiği sürece yürütülür. C'de doğru olan nedir? Diyelim ki, herhangi biri sıfır değildir. Bu, b'yi sıfırdan artırma ve f[] dizisini doldurma döngüsünün b, c'ye eşit olana kadar gerçekleştirildiği anlamına gelir, yani. 2800'e kadar. f[] dizisi aynı 10000/5 = 2000 sayılarıyla doldurulur.
Büyük bir hata yapana kadar mı?
Her neyse, Pi sayısı sadece bir şekilde hesaplanır ve geri kalan her şey farklı bir etekte bir mashka veya bir mashka'nın parçası :)
Bunun bir sorun olduğundan şüphelendim ...
Tamam hadi görelim.
İlk döngü ile başa çıkmak
Döngü, b - c = true olana kadar yürütülür. C'de doğru olan nedir? Diyelim ki, herhangi biri sıfır değildir. Bu, b'yi sıfırdan artırma ve f[] dizisini doldurma döngüsünün b, c'ye eşit olana kadar gerçekleştirildiği anlamına gelir, yani. 2800'e kadar. f[] dizisi aynı 10000/5 = 2000 sayılarıyla doldurulur.
Büyük bir hata yapana kadar mı?
Haydi bağıralım.
Şimdiye kadar doğru. Daha ileriye bakalım.
Ve işte kafa karışıklığı. İlk başlıkta (dış döngü), d=0 koşulu bir şekilde can sıkıcıdır. Her zaman doğru mu?
Sonraki iç içe döngüdür. yeniden yazma:
Ve işte kafa karışıklığı. İlk başlıkta (dış döngü), d=0 koşulu bir şekilde can sıkıcıdır. Her zaman doğru mu?
Evet, C'de kesinlikle (ve d buna şahittir) SON ifadesinin doğruluğu için kontrol edilir.