一副扑克牌,抽出一张,要求找出抽出的牌的点数和花色。

算法的主要思想就是用异或运算来确定丢的牌的花色。四种花色分别如下表示:红桃用1(二进制0001)表示,黑桃用2(二进制0010)表示,黑桃用4(0100)表示,方块用8(1000)表示,这样当同一点数的四个花色都齐全的话,则四种花色异或的结果再与15(1111)异或之后,结果为0。如果确实一种花色,则三张存在的牌的花色值异或后与15异或所得的结果为抽出的花色的值。比如说:抽出的花色为红桃,则0010^0100^1000^1111=0001,正好等于红桃的值。具体实现见下面的代码。

#include <stdio.h>
#include <map>
#define NUMS 2 //NUMS = 2 用于演示,如果是一副牌的话NUMS应定义为53
using namespace std; typedef struct Card{
  int num; //num用0-13分别表示A,2,3,4……,10,J,Q,K,王
  int flower; //flower表示花色 1表示红桃,3表示大王,2表示黑桃,12表示小王,3表示梅花,4表示方块
}Card; void find(Card cards[])
{
int i;
map<int,int> numclass_Map;
for(i=;i<NUMS;i++)numclass_Map[i] = ; for(i = ;i<NUMS*-;i++)
{
  numclass_Map[cards[i].num]^=cards[i].flower;
  if(numclass_Map[cards[i].num] == ) numclass_Map.erase(cards[i].num);
}
map<int,int>::iterator it;
it = numclass_Map.begin();
printf("点数:%d 花色:%d\n",it->first+,it->second);
} void main()
{
//just for test
Card cards[NUMS*-];
cards[].num = ;
cards[].flower = ; cards[].num = ;
cards[].flower = ; cards[].num = ;
cards[].flower = ; cards[].num = ;
cards[].flower = ; cards[].num = ;
cards[].flower = ; cards[].num = ;
cards[].flower = ; cards[].num = ;
cards[].flower = ; //cards[7].num = 1;
//cards[7].flower = 8; find( cards);
}

输出:

点数:2 花色:8

如果是抽出两种牌,这个算法也是可以分别找出抽出的牌的点数和花色的。这种容错的方法也就是raid3,4,5,6的容错方法,也就是奇偶校验方法。

53张牌中找出缺少的牌的花色和点数--raid3,4,5,6的容错原理的更多相关文章

  1. 转 A 、B两张表,找出ID字段中,存在A表,但是不存在B表的数据

    A.B两张表,找出ID字段中,存在A表,但是不存在B表的数据,A表总共13W数据,去重后大约3万条数据,B表有2W条数据,且B表的ID有索引. 方法一 使用not in,容易理解,效率低. selec ...

  2. ytu 1061: 从三个数中找出最大的数(水题,模板函数练习 + 宏定义练习)

    1061: 从三个数中找出最大的数 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 124[Submit][Status][We ...

  3. hdu 1595 find the longest of the shortest【最短路枚举删边求删除每条边后的最短路,并从这些最短路中找出最长的那条】

    find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  4. 如何在 Linux 中找出最近或今天被修改的文件

    1. 使用 ls 命令,只列出你的 home 文件夹中今天的文件. ls -al --time-style=+%D | grep `date +%D` 其中: -a- 列出所有文件,包括隐藏文件 -l ...

  5. 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)

    前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些. 先拿10000个数建堆, ...

  6. 海量数据中找出前k大数(topk问题)

    海量数据中找出前k大数(topk问题) 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小 ...

  7. python—networkx:在一张图中画出多个子图

    通过plt.subplot能够在一张图中画出多个子图 #coding: utf-8 #!/usr/bin/env python """ Draw a graph with ...

  8. 用C#写一个函数,在一个数组中找出随意几个值相加等于一个值 与迭代器对比

    算法!用C#写一个函数,在一个数组中找出随意几个值相加等于一个值比如,数组{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}  要找出那些数相加等 ...

  9. Leetcode33--->Search in Rotated Sorted Array(在旋转数组中找出给定的target值的位置)

    题目: 给定一个旋转数组,但是你不知道旋转位置,在旋转数组中找出给定target值出现的位置:你可以假设在数组中没有重复值出现 举例: (i.e., 0 1 2 4 5 6 7 might becom ...

随机推荐

  1. C# 16进制与字符串、字节数组之间的转换(转)

    1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串   //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToSt ...

  2. 第四次java实验报告

    20145306 实验四 java 开发基础 设计过程: 1.创建项目 2.选择activity_main.xml 3.显示自己的学号 4.双击改变字体大小 5.预览

  3. 条款19 command 模式与好莱坞法则

    当一个函数对象被当做回调时候,就是一个command模式的实例 什么是回调? 回调就是框架知道什么时候干一些事情,但是具体干什么,或许框架一无所知(因为回调函数不是他设计的),而用户则知道发生一个特定 ...

  4. 一款简单射击游戏IOS源码

    源码描述: 一款基于cocos2d的简单设计游戏,并且也是一款基于cocos2d的简单射击游戏(含苹果IAD广告), 游戏操作很简单,哪个数字大就点击射击哪个.里面有苹果iad广告,功能简单完整,适合 ...

  5. makefile中的target到底代表什么?

    刚开始用make的时候,以为makefile中名字叫做main的target就是make默认执行的target(中文翻译叫做标的(di,四声),下面统一称呼为标的),然后曾经很天真地犯过这样的错误,就 ...

  6. MySQL深入利用Ameoba实现读写分离

    3 ameoba安装配置   3.1 安装配置JDK [root@stu15 ~]# rpm -ivh jdk-7u67-linux-x64.rpm [root@stu15 ~]# cd /usr/j ...

  7. ASPX页面包含inc文件、用户控件、普通html文件

    如果你是从asp程序员转过来一定不习惯.net的编程风格吧,代码和页面时分离的,asp和php里面时常是引入, 比如<!--#include File="xxxxxxx"-- ...

  8. silverlight 退出系统(关闭当前网页),通过调用JS

    确认后直接退出系统,关闭当前页面 页面部分: <HyperlinkButton x:Name="LinkExit" Style="{StaticResource L ...

  9. 2016/09/21 Java关键字final

    1.final类 final类不能被继承,没有子类,final类中的方法默认是final的. final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的. 2.final方 ...

  10. shell脚本调用spark-sql

    为了更方便的查询并产生报表, 需要使用shell脚本调用spark-sql spark/bin/spark-sql --master spark://host:7077 -f ${SQL_FILE} ...