洗牌问题解答

原创 2006年05月23日 17:33:00

洗牌问题

 

2n张牌分别标记为1, 2, ..., n, n+1, ..., 2n,初始时这2n张牌按其标号从小到大排列。经一次洗牌后,原来的排列顺序变成n+1, 1, n+2, 2, ..., 2n, n。即前n张牌被放到偶数位置2, 4, ..., 2n,而后n张牌被放到奇数位置1, 3, ..., 2n-1。可以证明对于任何一个自然数n,经过若干次洗牌后可恢复初始状态。现在你的的任务是计算对于给定的n的值(n10^5),最少需要经过多少次洗牌可恢复到初始状态。

 

输入输出格式

 

输入数据由多组数据组成。每组数据仅有一个整数,表示n的值。

 

对于每组数据,输出仅一行包含一个整数,即最少洗牌次数。

 

样例输入

 

10

 

样例输出

 

6

 

 

程序代码如下:

#include <iostream>
void main()
{
 int i,j,k=0,p1,p2,n,*s1,*s2;
 printf("输入n:");
 scanf("%d",&n); 
 p1=1;p2=n+1;  //p1指向第一张牌,p2指向第n+1张牌
 s1=(int *)malloc(2*(sizeof(int)*(n+1))); //为数组s1动态申请2*(n+1)个空间
 s2=(int *)malloc(2*(sizeof(int)*(n+1))); //为数组s2动态申请2*(n+1)个空间
 //s1=new int[2*n+1]; 
 //s2=new int[2*n+1];
 for(i=1;i<=2*n;i++)
  s1[i]=i;   //牌的初始化,将其按编号存储到S1数组国 
 while(1)
 {
  for(i=1;i<=2*n;i++)  //根据洗牌规则将s1中的数搬到s2中
  {
   if(i%2!=0)
    s2[i]=s1[p2++];
   else
    s2[i]=s1[p1++];
  }  
        p1=1;p2=n+1;k++; //洗完一次牌后,p1,p2复位,洗牌的次数加1 
  for(j=1;j<=2*n-1;j++)  //判断牌是否已经按顺序存放
  { if(s2[j]<s2[j+1]) continue;
    else break;
  }
  if(j==2*n) {printf("经过了 %d 次洗牌/n",k); break;} //如果牌已经洗好
  for(i=1;i<=2*n;i++)  //根据洗牌规则将s2中的数搬到s1中
  { if(i%2!=0)
    s1[i]=s2[p2++];
   else
    s1[i]=s2[p1++];
  } 
  p1=1;p2=n+1;k++; //洗完一次牌后,p1,p2复位,洗牌的次数加1  
  for(j=1;j<=2*n-1;j++)  //判断牌是否已经按顺序存放
  { if(s1[j]<s1[j+1]) continue;    
    else  break;
  }
  if(j==2*n) {printf("经过了 %d 次洗牌/n",k); break;} //如果牌已经洗好
 }
}

c#实现洗牌程序

洗牌程序,意思就是,打乱现有序列的次序,并每次执行不会出现次序相同的序列的程序。 那么首先想到了使用随机数Random,快速实现如下: public int[] Shuffle(int...
  • Wolftotem18
  • Wolftotem18
  • 2016年09月12日 16:06
  • 436

String数组洗牌和List集合洗牌

造牌: Card[] cards = new Card[54]; int j=0; for(int i=0; i
  • badyflf
  • badyflf
  • 2012年10月02日 01:56
  • 1669

EXCEL常见问题五十问题解答

001。用命令按扭打印一个sheet1中B2:M30区域中的内容?我想在Sheet2中制件一个命令按扭, 打印表Sheet1中的[B2:M30] 区域中的内容?解答:可以将打印区域设为b2:m30,然...
  • songkexin
  • songkexin
  • 2007年01月25日 08:07
  • 10459

IOS这里是高效费舍尔茨洗牌 随机生成字符串

- (NSString *)shuffledAlphabet {    NSString *alphabet = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";    // Get th...
  • wssxy
  • wssxy
  • 2016年06月21日 14:53
  • 582

洗牌算法和随机数生成

【题目】 要求输入一组数据,输出的结果为这组数据的随机排列。 【解题思路】 1.      调用头文件algorithms中的random_shuffle函数。该函数的本质就是生成随机位置,不断...
  • sinat_26230689
  • sinat_26230689
  • 2016年08月31日 22:42
  • 524

java实现洗牌算法

业务代码写多了,应该时不时研究下算法,以保持思维的灵活性 import java.util.Iterator; import java.util.LinkedList; import java.ut...
  • u011589986
  • u011589986
  • 2016年11月30日 17:07
  • 793

洗牌算法 (C语言)

#include "stdafx.h" #include #include #include #include #include #include "OBJC_DEF...
  • microchenhong
  • microchenhong
  • 2011年05月31日 13:20
  • 2546

一个简单的C代码,模拟洗牌发牌

一个用指针、结构体,数组实现的高效的模拟洗牌发牌程序:
  • u012187684
  • u012187684
  • 2014年05月26日 16:17
  • 2262

写一个随机洗牌函数

题目 写一个随机洗牌函数。要求洗出的52!种组合都是等概率的。 也就是你洗出的一种组合的概率是1/(52!)。假设已经给你一个完美的随机数发生器。 解答 这是一道非常有名的面试题,及...
  • mengfanteng
  • mengfanteng
  • 2016年07月15日 21:11
  • 443

BZOJ1965: [Ahoi2005]SHUFFLE 洗牌

Portal由样例可以得到1−>2,2−>4,3−>6,4−>1,5−>3,6−>51->2,2->4,3->6,4->1,5->3,6->5. 可以得出一次洗牌后pos[i]=(2i)mod(n+...
  • Ep1C_HeReT1c
  • Ep1C_HeReT1c
  • 2017年03月14日 10:33
  • 217
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:洗牌问题解答
举报原因:
原因补充:

(最多只允许输入30个字)