Şimdi Ara

Şu Algoritmanın Neresi Hatalı? (2. sayfa)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir (1 Mobil) - 1 Masaüstü1 Mobil
5 sn
31
Cevap
1
Favori
1.061
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: önceki 12
Sayfaya Git
Git
Giriş
Mesaj
  • Glitch G kullanıcısına yanıt
    Yukarda Perl örneğinin yorumsuz sade hali :



    quote:



    @masa = 0 .. 999;



    until (@masa == 1) {

    push @masa, shift @masa;

    shift @masa;

    }



    print "Endeksi @masa olan kişi hayatta kaldı";




    until blogundaki "queue" yapısı, circular linked list olmadan işi çözüyor. Perl 'i herkesin incelemesini tavsiye ederim cunku buradaki push ve shift gibi değişik fonksiyonları var. Bu fonksiyonları sonradan dile eklemişler. Programlarda en cok kullanlan yapıları fonksiyona dönüştürüyorlar. shift dizinin en başındaki elemanı cekip diziyi 1 eleman kısaltıyor, push ise dizinin sonuna eleman ekleyerek diziyi 1 eleman büyütüyor. Josephus problemi temel olarak bu 2 satır ile çözülebiliyor: İlk kişi sağ kaldığı için listenin en sonuna ekleniyor , yanındaki kişi de öldüğü için listeden çekiliyor. Bu sekilde problemi çözdükten sonra Java ile ArrayList üzerine aynı işlemi simule ederek yazmak cok daha rahat ve zevkli olur.

    < Bu ileti mini sürüm kullanılarak atıldı >




  • quote:

    Orijinalden alıntı: Glitch

    Problemin adı Josephus Circle matematik veya programlama ile çözülebilir.Adım adım çözen bir program yazmıştım ama java ile.İstersen koyayım.
    Koyabilirsen harika olur.
  • @revivo72 circular linked list kullanmak zorunda olduğum için var.Pratik olmayabilir doğrudur.
    @AI Engineer netbeans kullanıyorsan onun projesini atabilirim daha rahat olur.
    Senin problemin için 1000 balon ve 2 aralık vermen lazım.Ölen numarayı yazmıyor,ama her ölümden sonra durumu basıyor ödev gereği.Ekle istersen.

    public class Circle { 

    Balon bas;
    Balon son;
    int sayi; // kaç balon olduğunu tutacak

    public void sonaEkle(quizz4.Balon b){
    //sona balon ekle
    if(bosMu()){
    bas=b;
    son=b;

    } else {
    son.sonraki=b;
    son=b;
    b.sonraki=bas;

    }
    sayi++;
    }
    public boolean bosMu(){
    return bas==null;
    }
    public void patlat(Balon b){
    if(sayi==2){
    //2 balon varken patlatma
    bas=b.sonraki;
    son=b.sonraki;
    bas.sonraki=null;
    } else {
    //2den fazla balon var
    if(b==bas){
    //patlayan balon bas
    son.sonraki=b.sonraki;
    son=b.sonraki;
    bas=son.sonraki;
    }
    else if(b==son){
    //patlayan balon son
    Balon it1 = bas;
    while(it1.sonraki!=b){
    it1=it1.sonraki;
    }
    it1.sonraki=bas;
    son=it1;
    }
    else {
    //patlayan balon ortada
    Balon it1 =bas;
    while(it1.sonraki!=b){
    it1=it1.sonraki;
    }
    it1.sonraki=b.sonraki;
    }

    }
    sayi--;
    }
    public void yazdir(){
    Balon iterator=bas;
    if(sayi==1){
    System.out.print(""+bas.sira+" ");
    }else{
    do{
    System.out.print(""+iterator.sira+" ");
    iterator=iterator.sonraki;
    }while(iterator!=bas);
    System.out.print(" ");
    }}}


    bu inner class da olabilir.

    public class Balon { 

    int sira; //ilk sırasını tutar
    Balon sonraki;
    public Balon(int sira){
    this.sira=sira;
    sonraki=null;
    }
    public Balon(){
    this.sira=-1;
    sonraki=null;
    }

    public String toString(Balon b){
    return ""+b.sira;
    }}


    bu da çalıştırmak için main method;

    public class Quizz4 { 

    public static void main(String[] args) {

    Scanner s=new Scanner(System.in);
    int kacBalon;
    int kacAralık;
    Circle circ=new Circle();
    System.out.println("Balon sayısını giriniz: ");
    kacBalon = s.nextInt();
    if(kacBalon<2){
    System.out.println("2'den fazla balon olmalı...");
    System.exit(0);
    }
    System.out.println("Kaç balon atlanarak patlatma işlemi gerçekleştirilecek: ");
    kacAralık=s.nextInt();
    if(kacAralık<1){
    System.out.println("Balon patlatma işlemi en az 1 balon atlayarak yapılır...");
    System.exit(0);
    }


    for(int i=0;i<kacBalon;i++){
    circ.sonaEkle(new Balon(i+1));
    }
    System.out.print("Balonların ilk hâli: ");
    circ.yazdir();
    System.out.println("");
    Balon iterator=circ.bas;
    int j=1;
    while(circ.sayi!=1){
    for(int i=0;i<kacAralık-1;i++){
    iterator=iterator.sonraki;
    }
    Balon iterator2=iterator;
    iterator=iterator.sonraki;
    circ.patlat(iterator2);
    System.out.printf(""+j+". Patlatma :");
    j++;
    circ.yazdir();
    System.out.println("");

    }
    System.out.println("--> Sona kalan balon: "+circ.bas.sira+" numara");
    System.out.printf("
    ");
    }}



    < Bu mesaj bu kişi tarafından değiştirildi Glitch -- 25 Temmuz 2018; 8:31:14 >




  • Glitch G kullanıcısına yanıt
    fecaat. hiç java bilmiyorsunuz

    bu java syntax'lı bir C programı olmuş, hem de kötü bir C programı.

    < Bu ileti mini sürüm kullanılarak atıldı >
  • seyfi84 S kullanıcısına yanıt
    Bu javayla yazdigim 4. programdi zaten isminden anlasildigi gibi :) Buyrun yazin arkadasa program.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Java ile aklıma ilk gelen çözüm aşağıda. SAYI masada kaç kişi olduğu. step kaçıncı kişiyi öldüreceği. pek test etmedim, varsa hatası söyleyin.

     
    public class Prog {
    private static int SAYI = 1000, step = 1;

    public static void main(String[] args) {
    int i,j;
    List<Integer> arr = new ArrayList<>(SAYI);
    for (i=0; i<SAYI; ++i) arr.add(i+1);
    for (i=0+step, j=SAYI; j>1; --j, i=(i+step)%arr.size())
    arr.remove(i);

    System.out.println("Kalan: "+arr.get(i));
    }
    }




    < Bu mesaj bu kişi tarafından değiştirildi seyfi84 -- 26 Temmuz 2018; 14:16:33 >
    < Bu ileti mini sürüm kullanılarak atıldı >
  • seyfi84 S kullanıcısına yanıt
    Kod hata verdi.
  • AI Engineer kullanıcısına yanıt
    en başta import satırı yok, oraya mı takıldın? hiç java bilmiyorsun galiba...

    < Bu ileti mini sürüm kullanılarak atıldı >
  • Arkadasa bi java sertifikasi yollayin ordan.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Programdaki hata: len(visitors) > 1 diyorsun, ancak listedeki 1,3,5..999 a kadar olan kısım duruyor. i ise 501 oluyor. Daha doğrusu artmaya devam ediyor. 501. indeks te eleman olmadığından hata veriyor.

    Probleme getirdiğim çözüm(Matematiksel olarak düşünmekten ziyade örüntüsel ilerledim, Python 3):

    #Dizide yerine göre tekleri yerine göre çitfleri çıkarıyorum. Çitfleri çıkardığım durum ise son kişinin eline bıçağın geçmesi durumu(Çift, tek derken liste sırasına göre, sayıya göre değil).

    visitors = list(range(1,1001))

    static = 1

    while(len(visitors) != 1 ):
    if(static):
    i = 1
    else:
    static = 1
    while( i < len(visitors) ):
    del visitors[i]
    if len(visitors) is 2 or (i == (len(visitors)-1)):
    i = 0
    static = 0
    break
    i = i + 1


    print(visitors[0])



    < Bu mesaj bu kişi tarafından değiştirildi imammmm -- 28 Temmuz 2018; 0:10:28 >




  • 
Sayfa: önceki 12
Sayfaya Git
Git
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.