PHP- Karekök hesaplama

Nordkapp

Doçent
Katılım
30 Ağustos 2009
Mesajlar
787
Reaksiyon puanı
16
Puanları
18
Arkadaslar , ornegin 1-16 ya kadar olan sayilarin karekokunu(karekokler cift sayi olacak) ekrana yazdirmak istiyorum. Ama bir turlu olmadi. Kodu ve ciktisini yazayim asagiya. Neyi atliyorum aceba?

Kod:
<?php
$d=0;
$e=0;
for($d=1;$d<=16;$d++)
    {
    $e=sqrt($d);
        if(($e%2)==0)
        {
        echo "$e<br>";
        }
    }
    ?>

Ciktisi:

2
2.2360679774998
2.4494897427832
2.6457513110646
2.8284271247462
4

Eger karekok alinan kismi soyle degistirsem
$e=round(sqrt($d),0);
cikti bu sefer soyle oluyor:

2
2
2
2
4
4
4
4

Mesela burda bana sadece 2 ve 4 lazim. Normalde calismasi lazim gibi gorunuyor. Hesaplayamadigim bi nokta var ama bir turlu bulamadim. 1 den 20 ye kadar olan sayilarin karelerini hesaplayip ekrana yazdirdim, orda sorun yok. Bir de tam tersini denemek istedim ama sonuc basarisiz. Onerilerinizi bekliyorum arkadaslar.
 

annttiigs

Profesör
Emektar
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
38
sqrt metodu geriye float değerler döndürmekte. Bu nedenle, kesirli de olsa 2'ye tam bölünen sayıları sonuç olarak döndürmekte.

bu durumda çözüm olarak bir öneri;

round ile kullanımda yazdığın sayıları bir dizi ve ya stringe atarak orada olmayan sayıları bastırmalısın.


şöyle ki;

Kod:
<?php

$d=0;
$e=0;
$s="";
for($d=1;$d<=16;$d++) {
	$e=round(sqrt($d),0); 
	if(($e%2)==0){ 
		if(!strpos($s,$e)){
			echo "$e<br>"; 
			$s+=$e+";";
		} 
	}
} 
?>

bunu bir dene bakalım :)
 

Nordkapp

Doçent
Katılım
30 Ağustos 2009
Mesajlar
787
Reaksiyon puanı
16
Puanları
18
Verdigin kodlari denedim ama malesef olmadi. Ilk mesajdaki ikinci ciktiyi aldim.
2
2
2
2
4
4
4
4

Ama onerin dogru. Mantikende her sayinin yalnizca bir kere ciktisini bastirmak lazim. Bende onu yapmayi dusundum aslinda ama yontemini bulamadim.
 

serkay1578

Doçent
Katılım
6 Ekim 2010
Mesajlar
893
Reaksiyon puanı
3
Puanları
0
PHP:
<?php
$d=0;
$e=0;
$e2=0;
for($d=1;$d<=100;$d++)
    {
    $e=round(sqrt($d));
    if ($e%2 == 0) {
        if ($e != $e2 || $e2 == 0) {
            echo round($e)."<br>";
        }
    }
    $e2=round(sqrt($d));
    }
?>

Buyrun muhtelemen bir float kontrolü ile daha basit halledilebilirdi ama araştırmak istemedi şimdi canım onu :)
 

annttiigs

Profesör
Emektar
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
38
Verdigin kodlari denedim ama malesef olmadi. Ilk mesajdaki ikinci ciktiyi aldim.
2
2
2
2
4
4
4
4
Ama onerin dogru. Mantikende her sayinin yalnizca bir kere ciktisini bastirmak lazim. Bende onu yapmayi dusundum aslinda ama yontemini bulamadim.
artık farz oldu eve gidiyim de bir wqmp kurayim :))
 
Katılım
31 Aralık 2007
Mesajlar
17,485
Reaksiyon puanı
188
Puanları
63
Sanırım istediğin şöyle basit bir şeydi :) Yapılması gereken şey formatted output :)


Kod:
for($i = 0; $i<=16; $i++){
echo $i." sayısının karekökü : ";
printf("%0.2f", sqrt($i));
echo "<br>";
}

Çıktı şu şekilde :

0 sayısının karekökü : 0.00
1 sayısının karekökü : 1.00
2 sayısının karekökü : 1.41
3 sayısının karekökü : 1.73
4 sayısının karekökü : 2.00
5 sayısının karekökü : 2.24
6 sayısının karekökü : 2.45
7 sayısının karekökü : 2.65
8 sayısının karekökü : 2.83
9 sayısının karekökü : 3.00
10 sayısının karekökü : 3.16
11 sayısının karekökü : 3.32
12 sayısının karekökü : 3.46
13 sayısının karekökü : 3.61
14 sayısının karekökü : 3.74
15 sayısının karekökü : 3.87
16 sayısının karekökü : 4.00
 

Nordkapp

Doçent
Katılım
30 Ağustos 2009
Mesajlar
787
Reaksiyon puanı
16
Puanları
18
Cevaplar icin tesekkur ediyorum arkadaslar.

Evet yapmak istedigim buydu. Yalniz ikinci if'deki ikinci sarti($e2 == 0) isi saglamlastirmak icin mi yazdik. Cunku orayi silince de calisiyor. Birde yazdirirken kullandigimiz round ifadesini sildigim zamanda tam sayi olarak yazdiriyor.

Neyse netice itibari ile yapmak istedigim buydu. Tekrar tesekkur ettim.

PHP:
<?php
$d=0;
$e=0;
$e2=0;
for($d=1;$d<=100;$d++)
    {
    $e=round(sqrt($d));
    if ($e%2 == 0) {
        if ($e != $e2 || $e2 == 0) {
            echo round($e)."<br>";
        }
    }
    $e2=round(sqrt($d));
    }
?>

Buyrun muhtelemen bir float kontrolü ile daha basit halledilebilirdi ama araştırmak istemedi şimdi canım onu :)
 

serkay1578

Doçent
Katılım
6 Ekim 2010
Mesajlar
893
Reaksiyon puanı
3
Puanları
0
Cevaplar icin tesekkur ediyorum arkadaslar.

Evet yapmak istedigim buydu. Yalniz ikinci if'deki ikinci sarti($e2 == 0) isi saglamlastirmak icin mi yazdik. Cunku orayi silince de calisiyor. Birde yazdirirken kullandigimiz round ifadesini sildigim zamanda tam sayi olarak yazdiriyor.

Neyse netice itibari ile yapmak istedigim buydu. Tekrar tesekkur ettim.

Evet yazarken round ifadesini gereksiz kullanmışım çünkü $e değişkeninin karekökünü alırken round etmişiz zaten,gözümden kaçmış o.

0 kontrolü yapmamın nedeni ilk gelen olan 2 yi yazdırmada problem yaşanmaması için.Ama ben bir an çift sayılara baktığımızı unutmuşum eğer çift sayılara bakmadan yapıyor olsaydık ve o sıfır kontrolünü koymasaydık 1 i yazmazdı.

Kolay gelsin
 

annttiigs

Profesör
Emektar
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
38
Sanırım istediğin şöyle basit bir şeydi :) Yapılması gereken şey formatted output :)


Kod:
for($i = 0; $i<=16; $i++){
echo $i." sayısının karekökü : ";
printf("%0.2f", sqrt($i));
echo "<br>";
}

Çıktı şu şekilde :

0 sayısının karekökü : 0.00
1 sayısının karekökü : 1.00
2 sayısının karekökü : 1.41
3 sayısının karekökü : 1.73
4 sayısının karekökü : 2.00
5 sayısının karekökü : 2.24
6 sayısının karekökü : 2.45
7 sayısının karekökü : 2.65
8 sayısının karekökü : 2.83
9 sayısının karekökü : 3.00
10 sayısının karekökü : 3.16
11 sayısının karekökü : 3.32
12 sayısının karekökü : 3.46
13 sayısının karekökü : 3.61
14 sayısının karekökü : 3.74
15 sayısının karekökü : 3.87
16 sayısının karekökü : 4.00

istenenin tam sayılar olması durumu var çağrı :) ya da ben öyle hissettim. bilemedim !
 
Katılım
31 Aralık 2007
Mesajlar
17,485
Reaksiyon puanı
188
Puanları
63
Ben de böyle düşündüm. Bı anlasamazlik durumu var. Eğer sadece tam sayı kısmı isteniyorsa da format değiştirilip ekrana farklı yansitilabilir tabi.
 

Nordkapp

Doçent
Katılım
30 Ağustos 2009
Mesajlar
787
Reaksiyon puanı
16
Puanları
18
Evet ekrana ciktisini almak istedigim degerler cift olan tam sayilardi, dogru hissettiniz:)
cgrszone,farkli kodlar kullanarakta olsa verdigin kodlarin ciktisini elde etmistim. Normalinde senin yazdigin kodlarla daha kisa yoldan cikti aliniyor. Ama istedigim her cift sayidan bir kere yazilmasiydi. Onun icinde bir sart konulmasi gerekiyordu. Nasil yapacagimi bulamamistim. serkay1578 arkadasin verdigi sekilde isi hallettim. Hepinize tesekkurler.
 

t(>_<t)

Öğrenci
Katılım
3 Ekim 2009
Mesajlar
44
Reaksiyon puanı
3
Puanları
0
Merhaba; for döngüsündeki sınırları değiştirin isteğinize göre.
Algoritmayı Şu Şekilde Kurdum :

- Karekök Değerlerinde, Küsüratlı Olanlarda "." Karakteri Oluyor
- Bu Yüzden "." Karakteri Olmayan Sayıları Ve
- "." Karakteri Olmayan Sayıların Çift Olanlarını Buluyorum
- Sayıları Bastırıyorum

PHP:
<?php
for ($i = 1; $i<=36; $i++)
{
    if (strpos("".sqrt($i), '.') == null && sqrt($i) % 2 == 0)
    echo 'KOK ('.$i.') : '.sqrt($i).'<br>';
}
?>

Kod:
KOK (4) : 2
KOK (16) : 4
KOK (36) : 6
 

sithlord

Öğrenci
Katılım
6 Ekim 2011
Mesajlar
38
Reaksiyon puanı
1
Puanları
0
php de casting yapilabilir, kod hem kisa hemde daha hizli olacaktir.

PHP:
for($i=1;$i<=16;$i++) {
    $kok = (int) sqrt($i);
    if(($kok % 2 == 0 ) && ($kok*$kok == $i))
        echo $kok."<br/>";
}
 

Nordkapp

Doçent
Katılım
30 Ağustos 2009
Mesajlar
787
Reaksiyon puanı
16
Puanları
18
Tesekkurler arkadaslar. Son iki ornekte guzeldi. Bir konuya farkli yonlerden bakmak her zaman icin yararlidir.
 
Üst