C++HOJジョセフ問題の配列,チェーンテーブルおよびSTL実装


【問題の説明】
番号を1,2,…nとするn人が1周して,約束番号k(1<=k<=n)の人が1から数え,mまで数えた人が列を出し,その次の人が1から数え,mまで数えた人が列を出し,順番に類推し,全員が列を出るまで,これによって1つの列を生み出す.
【配列実装】
#include 
#include 
int Josephu(int n, int m)
{
  int flag, i, j = 0;
  int *arr = (int *)malloc(n * sizeof(int));
  for (i = 0; i < n; ++i)
    arr[ i ] = 1;
  for (i = 1; i < n; ++i)
  {
    flag = 0;
    while (flag < m)
    {
      if (j == n)
        j = 0;
      if (arr[j])
        ++flag;
      ++j;
    }
    arr[j - 1] = 0;
    printf(" %4d      :%4d /n", i, j);
  }
  free(arr);
  return j;
}
int main()
{
  int n, m;
  scanf("%d%d", &n, &m);
  printf("      %d !/n", Josephu(n, m));
  system("pause");
  return 0;
}
int main()
{
  int n, m;
  scanf("%d%d", &n, &m);
  printf("      %d !/n", Josephu(n, m));
  system("pause");
  return 0;
}

【チェーンテーブル実装——シングルチェーンテーブル】
#include 
#include 
using namespace std;
typedef struct Node
{
  int index;
  struct Node *next;
}JosephuNode;
int Josephu(int n, int m)
{
  int i, j;
  JosephuNode *head, *tail;
  head = tail = (JosephuNode *)malloc(sizeof(JosephuNode));
  for (i = 1; i < n; ++i)
  {
    tail->index = i;
    tail->next = (JosephuNode *)malloc(sizeof(JosephuNode));
    tail = tail->next;
  }
  tail->index = i;
  tail->next = head;
  //     tail head          ,      ,    
  //         p、q       
  for (i = 1; tail != head; ++i)
  {
    for (j = 1; j < m; ++j)
    {
      tail = head;
      head = head->next;
    }
    tail->next = head->next;
    printf(" %4d      :%4d /n", i, head->index);
    free(head);
    head = tail->next;
  }
  i = head->index;
  free(head);
  return i;
}
int main()
{
  int n, m;
  scanf("%d%d", &n, &m);
  printf("      %d !/n", Josephu(n, m));
  system("pause");
  return 0;
}
 
  
 
  

【STL实现】

#include
#include
using namespace std;
//     
int JosephusProblem_Solution(int n, int m)
{
	if(n < 1 || m < 1)
		return -1;
	list listInt;
	unsigned i;
	//     
	for(i = 0; i < n; i++)
		listInt.push_back(i);

	list::iterator iterCurrent = listInt.begin();
	while(listInt.size() > 1)
	{
		//  m - 1 
		for(i = 0; i < m; i++)
		{
			if(++iterCurrent == listInt.end())
				iterCurrent = listInt.begin();
		}
		//         
		list::iterator iterDel = iterCurrent;
		cout<
 
  
 
  

【 】

1. ,flag ;

2. ;

3. , , ;

4. ,

5. ;

6.STL list.end() 。