Şimdi Ara

Javada Islem Suresi Sorunu

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
6
Cevap
0
Favori
1.091
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Javada henuz yeniyim denilebilir, bir somestr boyunca java dersi aldim okulda ancak henuz temel bilgilerim var. Bu yuzden sanirim bazi detaylari bilmedigimden aslinda kisa surede yapilabilecek islemler bende cok uzun zaman aliyor. Ornegin 2milyona kadar asal sayilari bulan bir program yazdigimda bunun asal olup olmadigini kontrol eden bir metodum oluyor ve eger asalsa arraya atiyor. Ancak bu cok cok uzun suruyor, hatta bir saat civarinda acik kaldi bilgisayarim ancak bitmedi buna ragmen hala islem. Bu tabi sadece bir ornek, bunun gibi buyuk sayilarla, yani O(N^2) veya O(N!) duzeyinde islemlerle, ugrastigim zaman yine ayni sorunla karsilasiyorum. Bu islem surelerini kisaltmanin bir yolu var mi ? Kodu basitlestirebildigim kadar basitlestirdim, gereksiz islem bulunmuyor kodumda tek sorun sayilarin cok buyuk olmasi. Internetten baktigim zaman ayni problemi cozenler, cevabini bulanlar olmus. Onlarin benim kadar beklemedigine eminim.







  • Bahsettigim problemin kodunu da yazayim asagiya:

    import java.util.ArrayList; 
    public class ThePrimes {

    public static boolean isPrimeFactor( int number) {
    boolean isPrime = true;
    for( int i = 2; i < number; i++) {
    if (number % i == 0) //to check if it is prime factor
    isPrime = false;
    }
    return isPrime;
    }
    public static void main(String[] args) {

    ArrayList<Integer> primes = new ArrayList<Integer>();
    int i, n;
    i = 0; //if a prime factor is found, adding 1 to i
    n = 2; //first prime factor is 2
    while( i < 2000000) { //to find 2M.th prime.
    if( isPrimeFactor( n)){
    i++;
    primes.add( n);
    }
    n++;
    }
    System.out.print( primes.get( primes.size()-1)); //Last index
    }
    }



    < Bu mesaj bu kişi tarafından değiştirildi CanYücel -- 24 Ocak 2012; 11:24:10 >
  • Bunun gibi durumlarda internetten uğraştığın konu hakkında bilgi almak faydalıdır genelde. google amca en büyük yardımcıdır. Mesela asal sayılar konusunu örnek verirsek bütün asal sayıları tek tek bilmen gerekli mi gerçekten. Eğer toplamlarını falan bulacaksan array olayına hiç gerek yok. Eğer asal sayıların hepsini belirlemek istiyorsan "sieve of eratosthenes" adlı yöntem böyle büyük aralıklardaki asal sayıları belirlemenin en iyi yoludur tüm sayıları tek tek kontrol etmekten daha iyi sonuç verir. Benzer şekilde N sayısı asal mı diye bakarken N den küçük bütün sayılara tek tek bölmene gerek yok karekökünden küçük sayılara bölmeyi denesen yeter. (ispatını internetten bulabilirsin yine) Bu da algoritmanın zaman karmaşıklığını O(N) seviyesinden O(karekök(N)) seviyesine indirger.

    Ayrıca sonsuz döngüye girmediğinden de emin olman gerek kodunun. Sonuç olarak dönüp dolaşıp aynı yere geliyoruz uğraştığın konuyla ilgili bir arkaplan bilgisi edinmek daima iyidir.




  • Evet karekokun de gecerli olabilecegi aklima gelmisti benim de yazarken ama sanirim kesin emin olabilmek icin bu yolu tercih ettim. O zaman sanirim bu tur problemler icin en iyi yol kodlarda herhangi bir degisiklik yapmak yerine matematiksel islemleri olabildigince kisaltmak. Imzandaki siteden calisiyorum ben de. Ilk 10 soruyu gayet iyi yapmistim ama ondan sonraki sorularda hep bu tur problemlerle karsilasinca elimi oynatamaz oldum ve mesele kod yazabilmekten baska boyutlara gecmisti artik. Yardimin icin tesekkur ederim bahsettigin yonteme bakacagim simdi
  • Algoritma gerekiyor sanırım, bilkent EE 1'deyim ben de. Uğraşa uğraşa gelişiyor, başta senin gibi bir method yazmıştım sonra geliştirdim. i>=Math.sqrt(number) kullanabilirsin ve isPrime = false yerine return false dersen döngüyü kırmış olursun böylece içindeki tüm sayılara bakmak zorunda kalmaz aşağıda da return true dersin.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.