folder Tahribat.com Forumları
linefolder C - C++
linefolder C De Belirli Aralıktaki Tam Kare Dik Üçgenleri Bulma(3-4-5Vs..)



C De Belirli Aralıktaki Tam Kare Dik Üçgenleri Bulma(3-4-5Vs..)

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    splintercell
    splintercell's avatar
    Kayıt Tarihi: 28/Eylül/2008
    Erkek

    müridler

    ///////////////////////////////////////////////////////////////////////////////////
    #include <stdio.h>
    #include <conio.h>

    int tamkaremi(int); //tam kare ise karekoku dondurur degilse 0 dondurur

    int main()
    {
        int i,j;
        for(i=1;i<=100;i++)
        {
            for(j=1;j<=i;j++)
            {
                if(tamkaremi(i*i + j*j) && tamkaremi(i*i + j*j)<=100) //hipotenus tam kare ve 100'den buyuk degil ise
                printf("%d-%d-%d\n",j,i,tamkaremi(i*i+j*j));
            }
        }
        getch();
        return 0;
    }

    int tamkaremi(int sayi)
    {
        int sayac,sonuc=0;
        for(sayac=2;sayac<=(sayi/2);sayac++)
        {
        if(((float)sayi/sayac)==sayac)
        {
            sonuc=sayac;
            break;
        }
        }
        return sonuc;
    }

    ///////////////////////////////////////////////////////////////////////////////

    şöyle bi kod yazdım bu kod şimdiki haliyle 0-100 arası tam kare dik üçgenleri hesaplayıp

    3-4-5

    6-8-10

    şeklinde ekrana yazdırıyo ama biraz yavaş çalışıyo gibi geldi bana

    acaba algoritmada bariz bi sorun mu var yoksa bu hız böyle bi işlem için normal mi anlayan müridler bi kodu deneyip el atarsa iyi olur

  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    NmC
    NmC's avatar
    Kayıt Tarihi: 23/Kasım/2008
    Erkek

    Kenarları hesaplarken içteki for'u 1den başlatman gereksiz sanırım.

    mesela 1 için

    1-2-3-4-...

    Hepsini deniyor.

    Sonra 2 için

    1-2-3-4-... diye gidecek.

    Farkındaysan 1-2 ve 2-1 oluştu. Aynı kenarları iki kere denemiş oldun. O yüzden ikinci döngüyü i'nin değerinden başlatmak daha mantıklı olabilir. Hatta i+1 den.

    Bildiğim kadarı ile ikizkenar olup tam kare çıkması mümkün değil.

    Ha ayrıca tam karebul fonksiyonu yerine sqrt den sonuç almak daha mantıklı. Tabi soruyu soran tüm fonksiyonları kendinin yazmanı istemiyosa.

    Ha sqrt ile nasıl kullanırsın.

    Döndürdüğü sayının tam kısmını sayıdan çıkarırsın. sonuç sıfırsa sayı tam sayıdır. :)

     


    There are 10 types of people in the world. Those who knows binary and those who dont...
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    splintercell
    splintercell's avatar
    Kayıt Tarihi: 28/Eylül/2008
    Erkek

    yok ya soru soran falan yok ben kendim uğraşıyorum can sıkıntısından:D sqrt fonksiyonundan dönen sayı tam mı virgüllü mü onu nasıl anlarım bulamadım ben de direk fonksiyon yazdım

    bu arada j=i+1ile başlatınca ikinci döngüyü imlec bos bos yanip söndü bişey çıkmadı:D eğer bunu daha hızlı yapabilen ve çalıştığından emin olduğun bi kod varsa koyarsan hem algoritma meraklısı arkadaşlara da yararı olur bi de dedigim gibi sqrtyi nasıl kullanırım anlayamadım daha doğrusu bi sayı tam sayı mı yoksa virgüllü mü

  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wking
    wking's avatar
    Kayıt Tarihi: 28/Mart/2010
    Erkek

    NmC bunu yazdı:
    -----------------------------

    Kenarları hesaplarken içteki for'u 1den başlatman gereksiz sanırım.

    mesela 1 için

    1-2-3-4-...

    Hepsini deniyor.

    Sonra 2 için

    1-2-3-4-... diye gidecek.

    Farkındaysan 1-2 ve 2-1 oluştu. Aynı kenarları iki kere denemiş oldun. O yüzden ikinci döngüyü i'nin değerinden başlatmak daha mantıklı olabilir. Hatta i+1 den.

    Bildiğim kadarı ile ikizkenar olup tam kare çıkması mümkün değil.

    Ha ayrıca tam karebul fonksiyonu yerine sqrt den sonuç almak daha mantıklı. Tabi soruyu soran tüm fonksiyonları kendinin yazmanı istemiyosa.

    Ha sqrt ile nasıl kullanırsın.

    Döndürdüğü sayının tam kısmını sayıdan çıkarırsın. sonuç sıfırsa sayı tam sayıdır. :)

     


    -----------------------------

    Hocam ikizkenar iki kenarın uzunlukları 32 √ 2 olursa hipotenüs 2 katı yani 64 olur ve tamkaredir. √ 64 = 8.

    Yani ikizkenar üçgenin hipotenüsü tamkare olabilir. Umarım yanlış anlamamışımdır. ô_Ô

  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    splintercell
    splintercell's avatar
    Kayıt Tarihi: 28/Eylül/2008
    Erkek

    @wking

    kenarları tam sayı olan ikiz kenar üçgen demek istedi NmC anladıgım kadarıyla:)

    çünkü kodda denenen dik kenarlar hep tam sayı

  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wking
    wking's avatar
    Kayıt Tarihi: 28/Mart/2010
    Erkek

    d0gan92 bunu yazdı:
    -----------------------------

    yok ya soru soran falan yok ben kendim uğraşıyorum can sıkıntısından:D sqrt fonksiyonundan dönen sayı tam mı virgüllü mü onu nasıl anlarım bulamadım ben de direk fonksiyon yazdım

    bu arada j=i+1ile başlatınca ikinci döngüyü imlec bos bos yanip söndü bişey çıkmadı:D eğer bunu daha hızlı yapabilen ve çalıştığından emin olduğun bi kod varsa koyarsan hem algoritma meraklısı arkadaşlara da yararı olur bi de dedigim gibi sqrtyi nasıl kullanırım anlayamadım daha doğrusu bi sayı tam sayı mı yoksa virgüllü mü


    -----------------------------

    Hoca Round() metodunu kullanman lazım. Şöyle ki:

    #include 
    #include
     
    int main(void)
    {
    for(double a=12;a<13;a+=0.1)
    printf("round of %.1lf is %.1lf\n", a, round(a));
    return 0;
    }
    Output:
    round of  12.0 is  12.0
    round of 12.1 is 12.0
    round of 12.2 is 12.0
    round of 12.3 is 12.0
    round of 12.4 is 12.0
    round of 12.5 is 12.0
    round of 12.6 is 13.0
    round of 12.7 is 13.0
    round of 12.8 is 13.0
    round of 12.9 is 13.0
    round of 13.0 is 13.0

    Kaynak: http://www.codecogs.com/reference/c/math.h/round.php

    Verdiğim linki incele derim :)

       
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wking
    wking's avatar
    Kayıt Tarihi: 28/Mart/2010
    Erkek

    d0gan92 bunu yazdı:
    -----------------------------

    @wking

    kenarları tam sayı olan ikiz kenar üçgen demek istedi NmC anladıgım kadarıyla:)

    çünkü kodda denenen dik kenarlar hep tam sayı


    -----------------------------

    Yanlış anlamışım sanırım :/ :D :|

  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    splintercell
    splintercell's avatar
    Kayıt Tarihi: 28/Eylül/2008
    Erkek

    bu round fonksiyonunu şimdi hatırladım:D C ye bayağıdır ara vermiştim bazı fonksiyonları unutmuşum:F zaten aynısı vbde de var

    kendi yazdıgım fonksiyon yerine round'u ve sqrtyi kullanınca bayağı hızlı oldu:)

     

    #include <stdio.h>

    #include <conio.h>
    #include <math.h>

    int main()
    {
        int i,j;
        for(i=1;i<=500;i++)
        {
            for(j=1;j<=i;j++)
            {
                if((round(sqrt(i*i+j*j)) - sqrt(i*i+j*j)==0) && sqrt(i*i+j*j)<=500) //hipotenus tam kare ve 500'den buyuk degil ise
                printf("%d-%d-%0.0f\n",j,i,sqrt(i*i+j*j));
            }
        }
        getch();
        return 0;
    }

     

     

    bu şekilde 0-500 arasını bile önceki 0-100 arasından çok daha hızlı yaptı:)

  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wking
    wking's avatar
    Kayıt Tarihi: 28/Mart/2010
    Erkek

    d0gan92 bunu yazdı:
    -----------------------------

    bu round fonksiyonunu şimdi hatırladım:D C ye bayağıdır ara vermiştim bazı fonksiyonları unutmuşum:F zaten aynısı vbde de var

    kendi yazdıgım fonksiyon yerine round'u ve sqrtyi kullanınca bayağı hızlı oldu:)

     

    #include

    #include
    #include

    int main()
    {
        int i,j;
        for(i=1;i<=500;i++)
        {
            for(j=1;j<=i;j++)
            {
                if((round(sqrt(i*i+j*j)) - sqrt(i*i+j*j)==0) && sqrt(i*i+j*j)<=500) //hipotenus tam kare ve 500'den buyuk degil ise
                printf("%d-%d-%0.0f\n",j,i,sqrt(i*i+j*j));
            }
        }
        getch();
        return 0;
    }

     

     

    bu şekilde 0-500 arasını bile önceki 0-100 arasından çok daha hızlı yaptı:)


    -----------------------------

    İşe yaramasına ve yapabilmene sevindim :))

  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    NmC
    NmC's avatar
    Kayıt Tarihi: 23/Kasım/2008
    Erkek

    round yapmanıza bile gerek yok... :)

    Cidden performans düşkünü iseniz sayıyı integera cast edin. zaten tam kısmını alacak :)

    int sayi = (int) sqrt(eskisayi);

    double fark = eskisayi -sayi;

    falan filan feşmekan... ilk (int)'i koymanıza da gerek yok aslında. Otomatik cast ediyo olması lazım (:

    Neyse ben namazı kılıp yatiom :D

    Hayırlı geceler hepinize...


    There are 10 types of people in the world. Those who knows binary and those who dont...
Toplam Hit: 2131 Toplam Mesaj: 10