Şimdi Ara

Aşırı zor c sorusu acil yardıma ihtiyacım var

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
14
Cevap
1
Favori
482
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • ileri düzey bir yazılım sorusu değil ama arkadaşlar ödevim var ve yaparken çok zorlandım keçileri kaçırmak üzereyim.yapabilene cidden helal olsun gözümde kendisi benim için 5. günün şafağında gelen gandalf gibidir.soru şu;

    Bir yumurta folyosunda sıralanmış n adet yumurtaların 1.sinden başlayıp x.nci yumurta kırılıyor. Bir sonraki yumurtadan devam edilip yine x.nci yumurta kırılıyor ve bu işlem son 1 yumurta kalana kadar devam ediyor. Kullanıcıdan n ve x değerlerini alan ve son kalan yumurtanın kaçıncı yumurta olduğunu bulan programı yazınız.(Ör. 5 yumurta varsa ve x=3 ise sırasıyla 3., 1., 5. ve 2. yumurtalar kırılır, 4. sıradaki yumurta sona kalır.)



  • 3. 1. ve 5. yumurtaların kırılmasını anladım ama en sonda 2 yumurta kaldığında neden 4. yumurta değil de 2. yumurta kırılıyor ?
  • quote:

    Orijinalden alıntı: soii

    3. 1. ve 5. yumurtaların kırılmasını anladım ama en sonda 2 yumurta kaldığında neden 4. yumurta değil de 2. yumurta kırılıyor ?

    tam anlamamış olabilirim ama sona kalan yumurtalar 2. ve 4. en son kırılan 5. olduğuna göre 2-4-2 diye saycak 2 de 3. olduğu için o kırılcak yanlış mı anlamışım?
  • leviathan123 L kullanıcısına yanıt
    Ben yazdiklarindan soyle anladim => x kadar gidiyoruz, 1 tane atliyoruz, sonra yine x kadar gidiyoruz 1 tane atliyoruz, sonra yine x kadar gidiyoruz ...

    1 2 3 4 5 numarali yumurtalardan ilk 3 u gidiyor, 4 u geciyoruz, 5 de kiriliyor. 8 yumurta olsaydi 4. ve 8. yumurta saglam cikacakti o halde, dogru anlamis miyim ?

    Su durumda, eger yanlis anlamadiysam (x+1) ile tam bolunebilen yumurtalar saglam cikiyorlar. Geri kalanlar her durumda kiriliyor. Su halde algoritmasinda cok bir sey yok, eger x > n ise hepsi kirilacak. degilse (else) , [x+1,n] arasinda (x+1) ile tam bolunebilen yumurtalar saglam cikacaklar.



    < Bu mesaj bu kişi tarafından değiştirildi Mephalay -- 18 Ağustos 2017; 18:10:33 >
    < Bu ileti tablet sürüm kullanılarak atıldı >
  • Dreazz aynen sizin dediğiniz gibi olmalı.
    Mephalay hocam olay 3'er index ilerleyip diziden sürekli eleman çıkartmaktan ibaret.
    1-2-3-4-5
    1-2-()-4-5
    ()-2-4-5
    2-4-()
    ()-4
    Parantezleri koyduğum yer o an bulunduğumuz index, sürekli 3 adım ilerleyip pop yapıyoruz. Sanırım ödev circular linked listle alâkalı, dinamik dizi yapısı olsa 5 dklık iş de, cde başka yöntem gelmedi aklıma.



    < Bu mesaj bu kişi tarafından değiştirildi Guest-D639AD061 -- 18 Ağustos 2017; 18:51:11 >
  • Bu mesaji okuyunca uyandim mevzuya, en sonda her turlu 1 yumurta kalmasi gerekiyor sanirim. O halde 1 yumurta kalana kadar iterasyon yapicaz. Ilk iterasyonda indexi x+1 ile tam bolunebilenler disinda digerlerini remove ediyoruz. Sonra da ayni sekilde kalan yumurtalari yine ayni mantikla (x+1) ile tam bolunebilenler seklinde itere ediyoruz.

    Daha kisa bir yontem de su hic yumurta iterasyonu ile ugrasmadan; direkt matematiksel olarak bulabiliriz.O da (x+1)^p indexine sahip eleman n dizide olacak sekilde maksimum p yi buluruz. Daha sonra da bu p degerine gore elde ettigimiz index'lerin sonuncusunu son kalan yumurta olarak gosteririz.
    Ornek x=1 , n = 9 ====> (x+1)^p <= n olacak sekilde p max 3 olabilir. ( 2^3 <= 9 ) . Bu indexten n icerisinde 1 tane var o halde x=1; n=9 => 8. yumurta son kalacak.
    Ornek x=3 , n = 63 ====> (x+1)^p <= n ise p max 2 olacak. 4^2 = 16. index, bu indexten n icerisinde 63/16 = 3 tane var. Su durumda 3. index son kalacak, yani 48. Eger n = 64 olsa idi p =3 olacakti ve 64. yumurta sona kalacakti.

    Tabi bunu n<x oldugu durumda son elemanin son yumurta ilan edilecegi varsayimi ile yazdim. Hala soruyu tam anlayamadigimi dusunuyorum : )

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




  • Hocam python kuruluysa veya repl.it adresinden şu kodu çalıştırın olayı anlayacaksınız. Ben olayı anladım pythonda bu kod çalışıyor ancak, cdeki kod bu mantıkla korkunç olacak sanırım. n+=2 yazmamın sebebi x'in hâlâ 3 olması, 2 değil.

    array = [8, 7, 12, 15, 3, 9, 4]
    print(array)
    n = 2
    for i in range(len(array) - 1):
    if n>=len(array):
    n %= len(array)
    print(array, " cikan eleman: ", array.pop(n))
    n += 2

    print(array[0])



    < Bu mesaj bu kişi tarafından değiştirildi Guest-D639AD061 -- 18 Ağustos 2017; 19:39:44 >
  • Zor oldu ama sonunda anladim, ben olayi komple farkli anlamisim. 1'den x'e kadar tum yumurtalar kirilimiyor, sadece x. yumurta kiriliyor. Listenin boyutu x'ten kucukse de ( n<x ) x mod n => bu index gidiyor cunku sondan tekrar basa geldigimizi varsayiyoruz, circular linked list mantigi. Kodu 1,2,3,4,5 ile calistirdim ve sorudaki gibi sonuc aldim.

    O halde struct ile yumurtalari birbirine baglayip son yumurtayi da ilk yumurtaya baglayip ( circular hale getirip ) listede 1 eleman kalincaya kadar itere etmek cozer meseleyi, bu kod da circular list yapmiyor, indexini modlayip cozuyor.

    < Bu ileti tablet sürüm kullanılarak atıldı >
  • dinamik dizi kullanarak yapmak benimde aklıma geldi ama dersin içeriğinde henüz o konuyu görmediğimiz için kullanmamızı istemiyor hoca aynı şekilde string foksiyonlarıda kullanmamızı istemiyor.heralde dizi oluşturup onun üzerinden işlem yapacaktık.Ben programı biraz çalıştırdım ama hatalı şu şekilde teslim ettim.mantıksal bir hata var çözmek için uğraştım baya ama olmadı.şu şekilde yaptım

    #include<stdio.h>
    #include<conio.h>
    int main ()
    {
    int n,mod=1,x,j=0,k,i=1;
    printf("Sirasiyla n ve x degerini giriniz\n");
    scanf("%d%d",&n,&x);
    k=n;

    while(n!=1)
    {
    for(i=mod;i<=n;i++)
    {

    j++;
    if(j%x==0){


    printf("%d. yumurta kirildi\n",i);

    }
    }
    mod=(i+1)%n;
    n--;
    }

    printf("saglam kalan yumurta %d",j%k);
    getch ();
    return 0;
    }




  • Hocanız cevabı paylaşırsa buraya yazabilir misiniz lütfen, sadece matematiksel olarak nasıl yapılacağını ben bulamadım.
  • Merhaba c++'da yazdım, kolaylıkla c'ye dönüştürülebilir. başka inputlar da denedim, çalışıyor gibi.

    #include<iostream>
    using namespace std;

    int kactanebir(int dizi[],int n)
    {
    int i,toplambir = 0;
    for(i = 0; i < n; i++)
    if(dizi[i] == 1)
    toplambir++;
    return toplambir;
    }
    int main()
    {/* saglam yumurta 1, kirilanlar 0 olsun */
    int dizi[5] = {1,1,1,1,1};
    int n = 5, x = 3,i=-1,k=0;
    /* en az bir yumurta kalincaya kadar devam et */
    while(kactanebir(dizi,n) > 1)
    {/* sürekli kir :) */
    while(1)
    {
    i=++i%n; /* saglam yumurtalari gez, dizi siniri asmamasi icin mod al */
    if(dizi[i] == 1)
    k++; /* saglam yumurtalari say */
    if(k == x) /* istenen sayiya ulasildiginda */
    {
    dizi[i] = 0; /* bulundugun konumdaki yumurtayi kir */
    cout << i+1; /* sira numarasini yazdir */
    k = 0; /* yeniden sayim icin */
    break; /* ic donguden cik ve kactanebir kaldigini tekrar kontrol et*/
    }
    }
    }
    cout << endl << "bitti";
    return 0;
    }



    < Bu mesaj bu kişi tarafından değiştirildi rukaplan -- 19 Ağustos 2017; 3:28:21 >




  • rukaplan R kullanıcısına yanıt
    Programın mantığı böyle olacaktı büyük ihtimalle çalışıyordur teşekkürler.dizi kullanmayı nasıl atladım bilemiyorum.dizi kullanmadan da sonuca çok yaklaştığım için olabilir .yoksa bulacaktım ama tünel görüşü dedikleri şeyi yaşadım heralde :D.
  • quote:

    Orijinalden alıntı: Dreazz


    quote:

    Orijinalden alıntı: soii

    3. 1. ve 5. yumurtaların kırılmasını anladım ama en sonda 2 yumurta kaldığında neden 4. yumurta değil de 2. yumurta kırılıyor ?

    tam anlamamış olabilirim ama sona kalan yumurtalar 2. ve 4. en son kırılan 5. olduğuna göre 2-4-2 diye saycak 2 de 3. olduğu için o kırılcak yanlış mı anlamışım?

    merhaba.

    yeri degil belki ama konulara bakarken gordum, iyi denk geldi.

    mesajini aldim, ama cevap yazamiyorum. telefon onayi istiyor. iki adet numara girdim gelmedi. sanirim alman numarasi oldugu icin. sorunu da cozemedim. oylece kaldi. kusura bakma sorun cozulurse, cevap yazarim.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.