PDA

Tam Sürümünü Görmek İçin : Bu forlar kaç çevrim yapar ?


sekizbit
23/05/2007, 23:36
Merhabalar, n hariç bütün değişkenler 0 olarak ayarli. sizce işlem bittiğinde x değişkeninde kaç kayıtlı olacağı, n cinsinden hesaplanabilirmi ? ben çıkamadım içinden.

for (i=1; i<n ; i++)
for(j=i ; j<n-1 ; j++ )
for(k =j ; k<n-3; k++)
x++;


Kurtaran
23/05/2007, 23:55
Sanırım n sayısına göre değişir...
Tahminimce n*(n-1)*(n-3) olması lazım.

sekizbit
24/05/2007, 00:09
sanirim okadar basit değil. örnek n ve, x çiktilarini aşağida vereyim birkaç tane.
birinciler n değerleri, ikincilerde x.


1 -->>0
2 -->>0
3 -->>0
4 -->>0
5 -->>1
6 -->>5
7 -->>15
8 -->>35
9 -->>70
10 -->>126
11 -->>210
12 -->>330
13 -->>495
14 -->>715
15 -->>1001
16 -->>1365
17 -->>1820
18 -->>2380
19 -->>3060
20 -->>3876

Kurtaran
24/05/2007, 01:31
Benim çıktılarımla seninkiler tutmuyor nedense..
Benim çıktılarım sole belki değişkenlerin ilk değerleri konusunda yanılmış olabilirim...

1 = 0
2 = 0
3 = 0
4 = 0
5 = 1
6 = 4
7 = 10
8 = 20
9 = 35
10 = 56
11 = 84
12 = 120
13 = 165
14 = 220
15 = 286
16 = 364
17 = 455
18 = 560
19 = 680
20 = 816


ve bu çıktıya gorede formül biraz uzun

∑ h^2 - ∑ [h*(h-1)]/2 (sigmalarda h=1 den n-4 e kadar)

Bunu koda dökersek de

for(z=1;z<=n-4;z++){
a=z*z;
b=z*(z-1)*0.5;
c=a-b;
d=d+c;
}oluyo...

mustafa
24/05/2007, 01:35
yazdığın kod için kurtaran'ın çıktılarının aynısı bulunuyor.

sekizbit
24/05/2007, 02:18
çıktılar konusunda haklısınız, buraya yazarken parantezi yanlış yere koymamdan dolayı farklı sonuç çıkmış dikkat etmeden geçirmişim, (hatta konsoldan kopyalamaya erindiğim için direk txt dosyasina yazdirip ordan buraya yapiştirmiştim :) )

Sayın kurtaran matematiksel ifadeniz için teşekkür ederim, bu formülü nasıl elde ettiğiniz konusunda bilgi verirmisiniz rica etsem ?

mustafa
24/05/2007, 02:25
for (i=1;i<n-3;i++) {x+=i*(n-3-i);}

formül bulamadım ama algoritma böyle sâdeleşebiliyor.

kâğıt kalemle kolay yapılışı ise...

n'in 4 eksiğini hesaplıyoruz. meselâ n=10 için rakamımız 6

sonra şöyle bir toplama yapıyoruz

1 * 6 +
2 * 5 +
3 * 4 +
4 * 3 +
5 * 2 +
6 * 1 = 56

sekizbit
24/05/2007, 02:27
aslında formül buldunuz, toplam sembölüde matematiğin bi ifadesi sonuçta. kodu sadeleştirmek aklıma gelmemişti teşekkür ederim.

o şekilde sadeleştrirmeyi bir kaç adım halinde gösterebilirmisiniz ?

mustafa
24/05/2007, 02:38
matematik olarak yapamam çünkü matematik olarak bulmadım.

$n=10;
$x=0;
for ($i=1;$i<$n;$i++) {
for ($j=$i;$j<($n-1);$j++) {
for ($k=$j;$k<($n-3);$k++) {
echo "i: " . $i . ", j: " . $j . ", k: " . $k . "<br>\n";
$x++;
}
}
}
echo $x . "<br>\n";

yukarıdaki php kodu çalıştırdım, verdiği çıkışları inceleyerek buldum :)

sekizbit
24/05/2007, 02:54
2 tane çözüm gelince ben mesajlari birbiri ile kariştirdim :)

mustafa, sizden ricam kodu nasıl for (i=1;i<n-3;i++) {x+=i*(n-3-i);} bu hale sadeleştirdiğinizi 2-3 adım halinde yazabilirmisiniz ?

lektroon
24/05/2007, 15:11
Benim cevabim su sekilde:

for(int i = 1; i<=(n-4); i++)
x += i*(i+1)/2;

Cunku senin en icerideki dongu her seferinde,
1 den (n-4)'e yani (n-4) kere
2'den (n-4)'e yani (n-3) kere
....
(n-3)'den (n-4)'e 1 kere

Bu satirlarin sayisi da (n-4) oluyor. Dolayisiyla, (n-4) satirda her satirda kac toplama islemi yapiliyorsa, o miktara kadar toplanmali:

1+2+...+(n-4) = (n-4)*(n-3)/2
+
1+2+...+(n-5) = (n-5)*(n-4)/2
+
...
+
1+2+3 = 3*(3+1)/2
+
1+2 = 2*(2+1)/2
+
1 = 1*(1+1)/2

Bu toplama isleminde az once belirttigim gibi (n-4) satir var.

sekizbit
25/05/2007, 02:29
çözümünüz için teşekkür ederim.