user-0 提问: 给定任意张牌，输出牌数最多的顺子

回复:
user: user-0
content: 引用 5 楼 zilaishuichina 的回复:[quote=引用 4 楼 wu4357815 的回复:] [quote=引用 3 楼 zilaishuichina 的回复:] 扑克牌  按点数总共13张    bool hasPoker[13] ; 用来保存某个点数有没有 初始全部标记为false， 然后 遍历你的pai数组，那个点数有就标记为true  然后遍历hasPoker， 统计连续的true最多的是从几到几， 就可以了 那请问怎么统计呢。。。[/quote]   	int currTrue = 0; 	int currBegin = -1; 	int maxTrue = 0; 	int maxBegin = -1; 	for (int i = 0; i < 13; i++) 	{ 		if (hasPoker[i]) //当前是true，计数+1 		{ 			currTrue++; 			if (-1 == currBegin)//第一个true，记录下标 			{ 				currBegin = i; 			} 		} 		else //当前是false，也就是顺子断掉了 		{	 //看当前统计出来的数字，是否比历史最高数字还要大 			 //是，则更新历史记录，并清空当前记录 			if (currTrue > maxTrue) 			{ 				maxTrue = currTrue; 				maxBegin = currBegin; 				currTrue = 0; 				currBegin = -1; 			} 		} 	} 	if (currTrue > maxTrue) 	{ 		maxTrue = currTrue; 		maxBegin = currBegin; 		currTrue = 0; 		currBegin = -1; 	} 	printf("最大连续张数%d,起始点数%d\n", maxTrue, maxBegin+1); [/quote] 经过我的多次实践，你的程序有错误。  #include <iostream> void get123(int a[],int len); void main() { 	int pai[]={6,7,9,11,12}; 	//int pai[]={0,0,1,1,1,1,1,0,0,1,1,1,1}; 	get123(pai,5); } void get123(int a[],int len) { 	int hasPoker[13]; 	for(int i=0;i<13;i++) hasPoker[i]=0; 	for(i=0;i<len;i++) 	{ 		if(hasPoker[a[i]-1]==0) hasPoker[a[i]-1]=1; 	} 	for(i=0;i<len;i++) 		std::cout<<a[i]<<","; 	std::cout<<"\n"; 	for(i=0;i<13;i++) 		std::cout<<hasPoker[i]; 	std::cout<<"\n"; 	int currTrue = 0; 	int currBegin = -1; 	int maxTrue = 0; 	int maxBegin = -1; 	for (i = 0; i < 13; i++) 	{ 		if (hasPoker[i]) //当前是true，计数+1 		{ 			currTrue++; 			if (-1 == currBegin)//第一个true，记录下标 			{ 				currBegin = i; 			} 		} 		else //当前是false，也就是顺子断掉了 		{     //看当前统计出来的数字，是否比历史最高数字还要大 			 //是，则更新历史记录，并清空当前记录 			if (currTrue > maxTrue) 			{ 				maxTrue = currTrue; 				maxBegin = currBegin; 				currTrue = 0; 				currBegin = -1; 			} 		} 	} 	if (currTrue > maxTrue) 	{ 		maxTrue = currTrue; 		maxBegin = currBegin; 		currTrue = 0; 		currBegin = -1; 	} 	printf("最大连续张数%d,起始点数%d\n", maxTrue, maxBegin+1); 	if(maxTrue>=5) 	{ 		for(int i=maxBegin+1;i<maxTrue+ maxBegin+1;i++) 			std::cout<<i<<" "; 	} }

user: user-1
content: 引用 7 楼 wu4357815 的回复:经过我的多次实践，你的程序有错误。   修改如下  int currTrue = 0; 	int currBegin = -1; 	int maxTrue = 0; 	int maxBegin = -1; 	for (int i = 0; i < 13; i++) 	{ 		if (hasPoker[i]) //当前是true，计数+1 		{ 			currTrue++; 			if (-1 == currBegin)//第一个true，记录下标 			{ 				currBegin = i; 			} 		} 		else //当前是false，也就是顺子断掉了 		{     //看当前统计出来的数字，是否比历史最高数字还要大 			//是，则更新历史记录，并清空当前记录 			if (currTrue > maxTrue) 			{ 				maxTrue = currTrue; 				maxBegin = currBegin; 			} 			currTrue = 0;//这里之前写错了，不管currTrue， maxTrue谁大谁小，都要清空当前记录 			currBegin = -1; 		} 	} 	if (currTrue > maxTrue) 	{ 		maxTrue = currTrue; 		maxBegin = currBegin; 	}

user: user-2
content: 应该自己动手写一下的。出了问题再拿出来讨论

user: user-3
content: 引用 2 楼 wu4357815 的回复:[quote=引用 1 楼 liuhengxiao 的回复:] 这个应该不是很难吧？  先把数组的内容从小到大有序排序 最大的顺子就是，从数组第一个元素到最后一个正好是一个顺子  用一个数保存最大顺子的长度 数组下标递增，做元素数值++对比，达到顺子要求并且比当前最大长度大的话 就替换，并记录这个最大顺子 一直到数组的倒数第四个元素结束（顺子长度大于5嘛）  代码还是自己写的比较好，在这里伸手要代码不是很好的样子，貌似  菜鸟分析，高手勿喷！ 你根本就没懂我的意思，那比如3,5,5,6,7,8,9，这样的牌型呢，第一个并不是顺子的起始牌[/quote]  3,5,5,5,6,7,8,9,不满足顺子要求啊 难道我红字说明的不明白。。。

user: user-1
content: 引用 4 楼 wu4357815 的回复:[quote=引用 3 楼 zilaishuichina 的回复:] 扑克牌  按点数总共13张    bool hasPoker[13] ; 用来保存某个点数有没有 初始全部标记为false， 然后 遍历你的pai数组，那个点数有就标记为true  然后遍历hasPoker， 统计连续的true最多的是从几到几， 就可以了 那请问怎么统计呢。。。[/quote]   	int currTrue = 0; 	int currBegin = -1; 	int maxTrue = 0; 	int maxBegin = -1; 	for (int i = 0; i < 13; i++) 	{ 		if (hasPoker[i]) //当前是true，计数+1 		{ 			currTrue++; 			if (-1 == currBegin)//第一个true，记录下标 			{ 				currBegin = i; 			} 		} 		else //当前是false，也就是顺子断掉了 		{	 //看当前统计出来的数字，是否比历史最高数字还要大 			 //是，则更新历史记录，并清空当前记录 			if (currTrue > maxTrue) 			{ 				maxTrue = currTrue; 				maxBegin = currBegin; 				currTrue = 0; 				currBegin = -1; 			} 		} 	} 	if (currTrue > maxTrue) 	{ 		maxTrue = currTrue; 		maxBegin = currBegin; 		currTrue = 0; 		currBegin = -1; 	} 	printf("最大连续张数%d,起始点数%d\n", maxTrue, maxBegin+1);

user: user-0
content: 引用 3 楼 zilaishuichina 的回复:扑克牌  按点数总共13张    bool hasPoker[13] ; 用来保存某个点数有没有 初始全部标记为false， 然后 遍历你的pai数组，那个点数有就标记为true  然后遍历hasPoker， 统计连续的true最多的是从几到几， 就可以了 那请问怎么统计呢。。。

user: user-1
content: 扑克牌  按点数总共13张    bool hasPoker[13] ; 用来保存某个点数有没有 初始全部标记为false， 然后 遍历你的pai数组，那个点数有就标记为true  然后遍历hasPoker， 统计连续的true最多的是从几到几， 就可以了

user: user-0
content: 引用 1 楼 liuhengxiao 的回复:这个应该不是很难吧？  先把数组的内容从小到大有序排序 最大的顺子就是，从数组第一个元素到最后一个正好是一个顺子  用一个数保存最大顺子的长度 数组下标递增，做元素数值++对比，达到顺子要求并且比当前最大长度大的话 就替换，并记录这个最大顺子 一直到数组的倒数第四个元素结束（顺子长度大于5嘛）  代码还是自己写的比较好，在这里伸手要代码不是很好的样子，貌似  菜鸟分析，高手勿喷！ 你根本就没懂我的意思，那比如3,5,5,6,7,8,9，这样的牌型呢，第一个并不是顺子的起始牌

user: user-3
content: 这个应该不是很难吧？  先把数组的内容从小到大有序排序 最大的顺子就是，从数组第一个元素到最后一个正好是一个顺子  用一个数保存最大顺子的长度 数组下标递增，做元素数值++对比，达到顺子要求并且比当前最大长度大的话 就替换，并记录这个最大顺子 一直到数组的倒数第四个元素结束（顺子长度大于5嘛）  代码还是自己写的比较好，在这里伸手要代码不是很好的样子，貌似  菜鸟分析，高手勿喷！