İçeriğe geç
ShiftDelete.Net
Haber ara/ SDN'ye SorGiriş
Haber Akışı SDNTV İnceleme Forum Yapay Zeka Akıllı Telefon Elektrikli Otomobil Oyun ShiftDelete.Net Global Teknoloji Haberleri Mobil Otomobil Donanım Savunma Bilim Sosyal Medya İnternet Giyilebilir Teknoloji Rehber Ürünler Son dakika Yazarlar
  1. Ana sayfa
  2. Topluluk
  3. Programlama
  4. Web Programlama (PHP, ASP, HTML, CSS, JavaScript)
Web Programlama (PHP, ASP, HTML, CSS, JavaScript)

PHP- Karekök hesaplama

Nordkapp28.10.201113 cevap11.601 görüntüleme
2009'den beri787 mesaj
#1
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?
<?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.
Cevaplar
2007'den beri2.589 mesaj
#2
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;
<?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 Konuyu açan
2009'den beri787 mesaj
#3
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.
2010'den beri893 mesaj
#4
<?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 :)
2007'den beri2.589 mesaj
#5
Nordkapp dedi: ↑
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 :))
2007'den beri17 bin mesaj
#6
Sanırım istediğin şöyle basit bir şeydi :) Yapılması gereken şey formatted output :)
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 Konuyu açan
2009'den beri787 mesaj
#7
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.
serkay1578 dedi: ↑
<?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 :)
2010'den beri893 mesaj
#8
Nordkapp dedi: ↑
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
2007'den beri2.589 mesaj
#9
cgrszone dedi: ↑
Sanırım istediğin şöyle basit bir şeydi :) Yapılması gereken şey formatted output :)
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 !
2007'den beri17 bin mesaj
#10
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 Konuyu açan
2009'den beri787 mesaj
#11
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.
2009'den beri44 mesaj
#12
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
for ($i = 1; $i<=36; $i++)
{
    if (strpos("".sqrt($i), '.') == null && sqrt($i) % 2 == 0)
    echo 'KOK ('.$i.') : '.sqrt($i).'<br>';
}
?>



KOK (4) : 2
KOK (16) : 4
KOK (36) : 6
2011'den beri38 mesaj
#13
php de casting yapilabilir, kod hem kisa hemde daha hizli olacaktir.

for($i=1;$i<=16;$i++) {
    $kok = (int) sqrt($i);
    if(($kok % 2 == 0 ) && ($kok*$kok == $i))
        echo $kok."<br/>";
}
Nordkapp Konuyu açan
2009'den beri787 mesaj
#14
Tesekkurler arkadaslar. Son iki ornekte guzeldi. Bir konuya farkli yonlerden bakmak her zaman icin yararlidir.

Cevabını yaz

Cevap yazmak için giriş yap ya da üye ol. Eski forum kullanıcı adın ve parolanla girebilirsin.