Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2011, 14:12   #1
tupak
 
Регистрация: 01.04.2009
Сообщений: 2
Сообщение Задача Иосифа Флавия (Visual С++)

Добрый всем день.... вот постановка задачи:

Задача Иосифа Флавия или считалка Джозефуса — известная математическая задача с историческим подтекстом.

Задача основана на легенде, что отряд Иосифа Флавия, защищавший город Йодфат, не пожелал сдаваться в плен блокировавшим пещеру превосходящими силам римлян. Воины, в составе сорока человек, стали по кругу и договорились, что каждые два воина будут убивать третьего, пока не погибнут все. При этом двое воинов, оставшихся последними в живых, должны были убить друг друга. Иосиф Флавий, командовавший этим отрядом, якобы быстро рассчитал, где нужно встать ему и его товарищу, чтобы остаться последними, но не для того, чтобы убить друг друга, а чтобы сдать крепость римлянам.

В современной формулировке задачи участвует n воинов, стоящих по кругу, и убивают каждого m-го. Требуется определить номер k начальной позиции воина, который остнется последним.

пример input 10 3
output 4

вроде попытался сделать... но где то ошибка... помогите пожалуйста найти (в коде оставил коментарии)


Код:
#include<iostream>

using namespace std;

int main(){

	int a[1000],b[1000],i,j,min,n,m,k,l=0,del,dell[1000],g=0,g2=0,z=0,l2=0,l3=0;

	cin>>n>>k;
	
	for(i=0;i<5;i++)
     dell[i]=i;

    del=dell[100];
	
	for(i=0;i<n;i++)
		a[i]=i+1;

	if(k>1){
	do{
	if(n-l3>g2)
		g=0;
	l=0;
	for(i=0;i<n-l3;i++)
		if(((i+1+g2)%k!=0)&&i<a[i]!=NULL){
	    b[l]=a[i]; 
		l++;
		g++;
		//cout<<" inside "<<a[i];
	//system("pause");
		}else if(i<a[i]!=NULL){
			g=0;
			l2++;}
    l3+=l2;
	l2=0;
	g2=g;
	
	for(i=0;i<l;i++)
		//cout<<b[i]<<" G2 l3- "<<l3<<" ";
	//system("pause");
	
		//cout<<a[i]<<" ";
	//system("pause");
	
	//system("pause");
	for(i=0;i<1000;i++)
    a[i]=del;

	for(i=0;i<l;i++)
    a[i]=b[i];
	z++;
	
	for(i=0;i<1000;i++)
    b[i]=del;

	/*
	for(i=0;i<l;i++){
	cout<<a[i]<<" G3 THIS IS A   l -  "<<l;
	
	system("pause");}*/
	
	}while(1<n-l3);
	
	//cout<<b[1];
	

	cout<<a[0];
}else
	cout<<a[n-1];
return 0;
}


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 04.10.2011 в 14:49.
tupak вне форума Ответить с цитированием
Старый 04.10.2011, 20:43   #2
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от tupak Посмотреть сообщение
... (в коде оставил коментарии)
Там где-то есть комментарии?! Да и имена переменных тоже очень понятные...
...
Код:
#include <stdio.h>

void PrintWarriors( int* war, int n ) {

   int i ;

   for ( i = 0; i < n; i++ )
      printf( "%3d", war[i] ) ;
   printf( "\n" ) ;

}


int GetNextWarriorToKill( int* war, int jLastKilled, int n, int k ) {
   
   int   jToKill = jLastKilled + 1 ,
         kLive = 1 ;

   do {
      if ( jToKill == n )
         jToKill = 0 ;
      else {
         if (war[jToKill++] == 0 ) 
            ++kLive ;
      }
   } while ( kLive <= k ) ;

   return jToKill-1 ;

}



int main() {

   const int n = 10,
             k =  3 ;
   int   i, 
         jLastKilled = -1 ,
         jToKill ,
         nKilled = 0;
   int   war[1000] ;

   for ( i = 0; i < n; i++ )
      war[i] = 0 ;

   while ( nKilled < n-1 ) {
      jToKill = GetNextWarriorToKill( war, jLastKilled, n, k ) ;
      war[jToKill] = ++nKilled ;
      jLastKilled = jToKill ;
      PrintWarriors( war, n ) ;
   }
   PrintWarriors( war, n ) ;

   for ( i = 0; i < n, war[i] != 0; i++ ) 
      ;
   printf( "The last warrior has #%d (counting from 1)\n", i+1 ) ;

   return 0 ;

}
Vago вне форума Ответить с цитированием
Старый 05.10.2011, 00:41   #3
tupak
 
Регистрация: 01.04.2009
Сообщений: 2
По умолчанию

Спасибо большое за полноценный ответ. Вы очень помогли

P.S. Под коментарием я имел ввиду то что указано в "//" и /* */.
tupak вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача на visual prolog 5.2 elena_24 Помощь студентам 0 31.05.2011 17:50
Задача по Visual C++ vidok_ Visual C++ 1 24.05.2011 21:32
Visual Basic задача Rainbow7 Помощь студентам 0 16.05.2011 20:26
задача на visual prolog sjua Помощь студентам 0 30.11.2010 21:38