C语言实现-“洗 扑克牌”程序 算法(详解)
1.问题引入
我们对“扑克牌”这个词并不陌生,作为一种娱乐活动被大众所熟知。那么,每一局结束后,除了人工洗牌,我们接触到的软件、小程序中如何实现的“洗牌”呢?其实,洗扑克牌的原理与乱数排列是相同的,都是将一组数字(如 1~N)打乱重新排列,只不过洗扑克牌多了一个花色判断的过程。
2.问题分析
一想到“随机”,大部分人想到的是利用产生随机数的方式 随机产生1~N的乱序数字并将之存入数组中,之后对后续产生的乱序数字存入数组前先检查阵列中是否已有重复的数字,如果数组中有这个数就不存入数组,再重新产生下一个数。在糟糕的情况下,如果多次产生的乱序数字都与数组中的数字重复,那么则会导致程序的执行速度变得缓慢,影响代码运行效率,因此这并不是一个很好的办法,如何进行改进呢?
我们以1-52的数字的乱数排序进行分析。首先,我们可以将数组按顺序从1-52依次填入,然后采用一个循环访问数组并随机产生1-52的乱序数,之后将产生的乱序数当作索引取出数组值,并与目前访问到的数组值交换 ,这样就不会产生重复的数字。也就是通过交换数组对应的值,即满足产生的数是乱序的,也提到了代码运行效率。
那么,如何判断牌的花色呢?我们只需要借助除法就可以解决这个问题,取商数判断花色,取余数判断数字。
3.代码实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 52int main() {int poker[N + 1]; int i, j, tmp, remain;//初始化阵列(数组) for(i = 1; i <= N; i++){poker[i] = i;}srand(time(0));//刷新每次产生的随机数//洗牌for(i = 1; i <= N; i++){j = rand() % 52 + 1; //从序号1开始产生52个随机数tmp = poker[i]; poker[i] = poker[j]; poker[j] = tmp;}for(i = 1; i <= N; i++){// 判断花色switch((poker[i]-1) / 13){ case 0:printf("黑桃"); break;case 1:printf("红心"); break; case 2:printf("方块"); break;case 3:printf("梅花"); break;}// 扑克牌数字remain = poker[i] % 13; switch(remain){case 0:printf("K "); break; case 12:printf("Q "); break; case 11:printf("J "); break; default:printf("%d ", remain); break;}if(i % 13 == 0){printf("\n");}}return 0;
}
4.运行效果
写在最后:
读两遍下来,如果仍然有不清楚的地方,可以再来一遍。
如果你有其他感到困惑的问题,欢迎留言。
C语言实现-“洗 扑克牌”程序 算法(详解)相关推荐
- c4.5算法 程序语言,决策树之C4.5算法详解-Go语言中文社区
决策树之C4.5算法详解 主要内容 C4.5算法简介 分裂属性的选择--信息增益率 连续型属性的离散化处理 剪枝--PEP(Pessimistic Error Pruning)剪枝法 缺失属性值的处理 ...
- C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法
选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...
- c语言 程序统计注释比例,C语言统计单词数量程序 超详解
/*************************************************************************************************** ...
- 【5G/4G】128-EEA1与128-NEA1算法详解
文章目录 128-EEA1与128-NEA1算法详解 本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算力网络技术标准研究. 博客 ...
- md5与des算法有何不同_Python算法详解:为什么说算法是程序的灵魂?
算法是程序的灵魂,只有掌握了算法,才能轻松地驾驭程序开发.软件开发工作不是按部就班,而是选择一种最合理的算法去实现项目功能.算法能够引导开发者在面对一个项目功能时用什么思路去实现,有了这个思路后,编程 ...
- C语言实现扫雷完整算法详解~(附完整代码~)
扫雷是一个常见小游戏,那么如何用C语言实现扫雷呢?学习了二维数组之后,我们可将扫雷的网格区域存储为二维数组,从而使用C语言实现扫雷. 目录 1.算法基本思路 2.算法详解 1.初始化数组与打印数组 2 ...
- 1000以内完数c语言程序_C语言经典面试题目及答案详解(二)
接着上次来说,C语言经典面试题目及答案详解(一)当中大部分是一些概念和理解的东西 ,今天说一说实践操作,有关c的经典程序. 1.输出9*9口诀.共9行9列,i控制行,j控制列. #include &q ...
- 一个简单的C语言程序(详解)
C Primer Plus之一个简单的C语言程序(详解) #include <stdio.h>int main(void) //一个简单的 C程序 {int num; //定义一个名为 n ...
- AT89C51单片机流水灯c语言程序及详解(扫盲教程)
AT89C51单片机是我们学习单片机必学的一个单片机,也是单片机入门的教材,下面给大家展示一下流水灯的编写方法适合初学者 首先先在proteus画出仿真图,方便仿真程序 下面来编写程序,先来写入头函数 ...
最新文章
- 940m显卡 出现跳动的小点_启用4K 120Hz后NVIDIA安培显卡黑屏 原因找到:HDMI 2.1芯片BUG导致...
- Compass 更智能的搜索引擎(3)--高亮,排序,过滤以及各种搜索
- 为不同的屏幕尺寸提供不同的图片(为那些没有必要下载全尺寸大图的设备节省带宽)...
- R语言观察日志(part5)--利用readr和readxl包读写数据
- Safari支持Service Worker,PWA还有多久爆发?
- 教育|一位女博士五年的艰难毕业历程
- uni-app获取当前具体日期时间并将其格式化
- Show ip arp 和 Show mac-address-table
- 大学计算机vfp最新考试题库,大学计算机vfp考试选择题题库.doc
- ELMo ,LM:一串词序列的概率分布probability distribution over sequences of words
- JavaScript高级程序设计读书笔记--语言基础
- 从TOP IT公司5年收入和利润变化看货币战争
- Windows10 1909:真正解决开机C:\WINDOWS\system32\config\systemprofile\Desktop不可用
- js添加多marker 高德地图_web开发如何使用高德地图API(四)通过AMap.Marker自定义标点...
- PHP 处理多重数组
- 基于Matlab深度学习目标检测算法系统GUI,单目标、多目标检测
- resultMap和resultType区别
- 物联网专业的优势、发展趋势与障碍的介绍
- 宇龙酷派202笔试题
- 好用的 ScreenToGif gif录制