• 28-12-2010, 16:52:09
    #1
    Yıllar önce bir kral 21 tane mahkum içerisinden ikisini affetmeye karar verir.
    Mahkumlar dairesel şekilde dizilmektedir.Ve her birine 1 kılıç veriliyor.Birinci kişiden başlayarak her seferinde iki kişi atlayıp üçüncü kişi dördüncü kişiyi öldürüyor.Tekrar iki kişi atlayıp yedinci sekizinciyi öldürüyor Sonra kalan iki kişi kurtuluyor onu bulunuz..

    Bu sorunun bir çok yöntemi varmış..

    Hocanın istediği While döngüsü ile cevap yapılıcakmış..
    Güveniyorum size r10 =)=)
  • 28-12-2010, 17:08:06
    #2
    hocam bu nasıl döngüdür yahu okurken kendimi kaybettim,başım döndü şaka bir yana akşam eve geçince uğraşıp yardımcı olmaya çalışacağım.
  • 28-12-2010, 21:28:11
    #3
    MaxidaTa adlı üyeden alıntı: mesajı görüntüle
    hocam bu nasıl döngüdür yahu okurken kendimi kaybettim,başım döndü şaka bir yana akşam eve geçince uğraşıp yardımcı olmaya çalışacağım.
    Teşekkürler çok sevinirim.. =)
  • 28-12-2010, 21:53:58
    #4
    daha once bunu cozmustum bilinmis bir soru hatırlayıp c#da kodlarını yazarım
    edit: soru biraz degismis gibi geldi. ilk donmede hangileri ölüyor hangileri kalıyor yazar mısın
  • 28-12-2010, 21:57:13
    #5
    Edit....:
    soru bu sandım ama yanlış okumuşum yinede fikir verebilir...
    http://www.frmtr.com/c-ve-c/877604-c...ml#post9049960

    #include<stdio.h>
    #include<conio.h>
    
    main()
    {
          int A[21]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; //Mahkumların hepsine 1 degeri verdim,yaşadıklarını belirtmek için.
          int i,j,n,sayac,x;
          i=0; // 1. mahkumdan başlandığı için i=0 başlangıç değeri verdim.
          while(1) { sayac=0;x=0;n=i+1;
           while(1){ if(n>20) n=0;
                     if(A[n]==1) sayac++; //Hayatta olan mahkumdan sonraki hayatta olan ilk iki mahkumu bulmak icin,
                     if(sayac==2) break;  //sonsuz döngü açtım,bu ilk iki mahkumdan ikincisine ulaştığımda döngüyü kırdım,
                     n++;                 //çünkü ölücek olan ikinci mahkum olacak,
                    }
            A[n]=0;//döngüyü kırdıktan sonra o makuma 0 değeri vererek öldürdüm.
            
            while(1) { n++;                      //öldürdüğüm mahkumdan sonra gelen ilk hayattaki mahkumu bulmak için,
                       if(n>20) n=0;             //yine sonsuz bir döngü açtım,çünkü bi yerden sonra ölü mahkumdan sonra gelen,
                       if(A[n]==1) {i=n;break;}  // mahkumda ölü olabilir,yani 18.=0,19.=0 olabilirdi.
                      }
            for(j=0;j<21;j++) { if(A[j]==1) x++;} // for döngüsüyle hayatta kalan tek 1 kişi olup olmadığını kontrol ettim,
            if(x==1) break;                       //eğer 1 kişi kalmışsa en baştaki sonsuz döngüyü kırıp çıktım..
                    }
            for(j=0;j<21;j++) {if(A[j]==1) { printf("%d",j+1);break;} // son olarak hayatta olan kişiyi indis numarısıyla buldum..
                                                                       //indis numarasını 1 arttırım çünkü A[0] 1. kişiyi temsil ediyo aslında.
                              } 
                              
                              
            getch();return 0;
    }
  • 28-12-2010, 22:57:59
    #6
    XEJDER adlı üyeden alıntı: mesajı görüntüle
    daha once bunu cozmustum bilinmis bir soru hatırlayıp c#da kodlarını yazarım
    edit: soru biraz degismis gibi geldi. ilk donmede hangileri ölüyor hangileri kalıyor yazar mısın
    Walla hiç bilmiyorum ki =) O yüzden sizlerden sizden yardım ettim..

    kafilem adlı üyeden alıntı: mesajı görüntüle
    Edit....:
    soru bu sandım ama yanlış okumuşum yinede fikir verebilir...
    http://www.frmtr.com/c-ve-c/877604-c...ml#post9049960

    #include<stdio.h>
    #include<conio.h>
    
    main()
    {
          int A[21]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; //Mahkumların hepsine 1 degeri verdim,yaşadıklarını belirtmek için.
          int i,j,n,sayac,x;
          i=0; // 1. mahkumdan başlandığı için i=0 başlangıç değeri verdim.
          while(1) { sayac=0;x=0;n=i+1;
           while(1){ if(n>20) n=0;
                     if(A[n]==1) sayac++; //Hayatta olan mahkumdan sonraki hayatta olan ilk iki mahkumu bulmak icin,
                     if(sayac==2) break;  //sonsuz döngü açtım,bu ilk iki mahkumdan ikincisine ulaştığımda döngüyü kırdım,
                     n++;                 //çünkü ölücek olan ikinci mahkum olacak,
                    }
            A[n]=0;//döngüyü kırdıktan sonra o makuma 0 değeri vererek öldürdüm.
            
            while(1) { n++;                      //öldürdüğüm mahkumdan sonra gelen ilk hayattaki mahkumu bulmak için,
                       if(n>20) n=0;             //yine sonsuz bir döngü açtım,çünkü bi yerden sonra ölü mahkumdan sonra gelen,
                       if(A[n]==1) {i=n;break;}  // mahkumda ölü olabilir,yani 18.=0,19.=0 olabilirdi.
                      }
            for(j=0;j<21;j++) { if(A[j]==1) x++;} // for döngüsüyle hayatta kalan tek 1 kişi olup olmadığını kontrol ettim,
            if(x==1) break;                       //eğer 1 kişi kalmışsa en baştaki sonsuz döngüyü kırıp çıktım..
                    }
            for(j=0;j<21;j++) {if(A[j]==1) { printf("%d",j+1);break;} // son olarak hayatta olan kişiyi indis numarısıyla buldum..
                                                                       //indis numarasını 1 arttırım çünkü A[0] 1. kişiyi temsil ediyo aslında.
                              } 
                              
                              
            getch();return 0;
    }
    İlginiz için teşekkürler..
    Bu soruyu çözebilirsek çok iyi olucak..
  • 28-12-2010, 23:25:27
    #7
    mahkum yerine asker demisim sonradan farkettim ama düzeltmedim işine yarar umarım

            int asker_sayisi = 21;
    	int asker = 0;
    	int askerler[21];
    
    	for(int i=0;i<asker_sayisi;++i)
    		askerler[i] = 1;
    
    	while( asker_sayisi>2 )
    	{
    		for(int i=0;i<3;++i)
    		{
    			asker = ((asker + 1)%21);
    			if(askerler[asker]==0)
    				--i;
    		}
    		askerler[asker] = 0;
    		asker_sayisi--;
    		asker = (asker + 1)%21;
    	}
    
    	cout<<"Kalanlar:"<<endl;
    
    	for( int i=0;i<21;++i)
    	{
    		if(askerler[i])
    			cout<<i+1<<". asker"<<endl;
    	}
  • 29-12-2010, 13:20:37
    #8
    sanırım cevabın 1 ile 21 çıkması gerekiyormuş ama yöntem nasıl ???