C De Belirli Aralıktaki Tam Kare Dik Üçgenleri Bulma(3-4-5Vs..)
-
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
-
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. :)
-
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ü
-
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. ô_Ô
-
@wking
kenarları tam sayı olan ikiz kenar üçgen demek istedi NmC anladıgım kadarıyla:)
çünkü kodda denenen dik kenarlar hep tam sayı
-
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
Output:
#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;
}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 :)
-
-
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 :|
-
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ı:)
-
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
#includeint 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 :))
-
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...
