前几天想到一个有趣的问题,我们每个手机都可以设置手势密码,那么手势密码一共有几种呢?

我们先了解下手势密码设置的规则:密码必须不小于4个点,点在第一次经过时不允许被跳过。

如图,我们把每个点编上序号。

则以下这种是不合法的。

5被连接了两次

这种是合法的,因为5被跳过了。而被跳过的点不被记为总点数。

用数字表示的话,例如1923则不能为四个点连接的情况,因为1和9之间有5,所以实际上是15923。

如果用纯理性分析的话,这无疑是个极为复杂的数学题,很多数学技巧似乎都被限制住。但是,我们有计算机这个无比强大的工具。这里,我选择用C语言处理。

宏定义

#define SIZE 10000
#define XSIZE 5
#define SIZEX 11111

以五个数字组成的密码举例,SIZE为

,XSIZE为位数,SIZEX为起始的穷举数字。这样通过改变三个变量,能得到不同的组合的个数。

主函数部分

void main(){int n = 0;int i = SIZEX, j = 0;for (i; i < SIZE*10; i++) {if(check(i)) n++;}printf("%d",n);
}

主函数部分十分简单,就是简单的循环遍历。

check函数部分

int check(int i)
{int k = 0, j = SIZE;int a[XSIZE];while (k<XSIZE) {a[k] = i / j;i = i - a[k] * j;j = j / 10;k++;}for (k=0; k < XSIZE; k++) {for (j = k + 1; j < XSIZE; j++) {if (a[k] == a[j]) return 0;}if (a[k] == 0) return 0;}for ( k = 0; k+1< XSIZE; k++){if ((a[k] + a[k + 1]) == 4) {if (!check1(a, k)) return 0;}if ((a[k] + a[k + 1]) == 10) {if (!check1(a, k)) return 0;}if ((a[k] + a[k + 1]) == 16) {if (!check1(a, k)) return 0;}if (a[k] - a[k + 1] == 6 || a[k + 1] - a[k] == 6) {if (!check1(a, k)) return 0;}}return 1;
}

该函数大致分为三个部分,第一部分,对传入的i分离i的各个位数的数字,并存入数组中。第二部分,设置两个循环判断数组中是否有相同的数字,第三部分,设置循环,遍历相邻的两个数字,判断这两个数字是否满足可能非法的条件,即两个数字间是否包含第三个数字,然后传入check1函数,判断两个数字前是否有中间包含的第三个数字,存在的话说明是合法的。

check1函数

int check1(int *a, int k) {for (int i = 0; i < k; i++) {if (a[i] == (a[k] + a[k + 1]) / 2) return 1;}return 0;
}

结论

运行程序,发现各个数字的个数,其中

4位的有1624

5位的有7152

6位的有26016

7位的有72912

8位的有140704

9位的有140704个

总共有389112种!

值得一提的是,6位以下的个数甚至每到10000种,所以设置密码最好设置6位以上的,当然不怕忘记的话,可以设置9位的变态密码。

完。

判断手势_手势密码有几种?相关推荐

  1. java正则表达式判断问号_正则表达式问号的四种用法详解

    原文符号 因为?在正则表达式中有特殊的含义,所以如果想匹配?本身,则需要转义,\? 有无量词 问号可以表示重复前面内容的0次或一次,也就是要么不出现,要么出现一次. 非贪婪匹配 贪婪匹配 在满足匹配时 ...

  2. recyclerview 滚动冲突_如何处理手势冲突 | 手势导航连载 (三)

    作者 / Chris Banes, Android 开发者关系团队工程师 我们将在近期为大家带来一个关于 "手势导航" 的系列连载,本文是手势导航连载的第三篇,如果您希望查看前两篇 ...

  3. 深度学习:在图像上找到手势_使用深度学习的人类情绪和手势检测器:第2部分

    深度学习:在图像上找到手势 情感手势检测 (Emotion Gesture Detection) Hello everyone! Welcome back to the part-2 of human ...

  4. 深度学习:在图像上找到手势_使用深度学习的人类情绪和手势检测器:第1部分

    深度学习:在图像上找到手势 情感手势检测 (Emotion Gesture Detection) Has anyone ever wondered looking at someone and tri ...

  5. demo h5 touch 移动_H5案例分享:移动端touch事件判断滑屏手势的方向

    移动端touch事件判断滑屏手势的方向 方法一 当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY: 当触发touchmove事件时,在获取此时手指的横坐标 ...

  6. 取消计算机用户密码页面,电脑怎么关闭开机密码_电脑开机取消登录密码的两种方法-系统城...

    为了电脑的安全和隐私,很多小伙伴在使用电脑时都会设置开机密码.然而有的用户却觉得在设置后每次开机都很麻烦,想要将其取消,那电脑怎么关闭开机密码呢?对于这一问题,今天小编就来教大家关于电脑开机取消登录密 ...

  7. 自定义手势--输入法手势技术

    进行软件开发时,通常我们都喜欢使用较新版本的工具,但这里我为什么使用低版本的SDK来开发Android游戏呢?这里介绍下原因: 1.Android SDK 属于向下兼容!那么低版本可以运行的,高版本基 ...

  8. 苹果6s照相快门声音设置_手机隐藏的10种快门启动方式,你都知道吗?

    上次我们讲了相机设置--手机照片尺寸的设置(错过的朋友可以在本文文末点击阅读)今天我们要来讲讲相机设置中的第二课「快门设置」.今天讲的快门设置不是我们以往说的设置"快门速度",而是 ...

  9. 用 JavaScript 实现手势库 — 手势动画应用【前端组件化】

    前端<组件化系列>目录 「一」用 JSX 建立组件 Parser(解析器) 「二」使用 JSX 建立 Markup 组件风格 「三」用 JSX 实现 Carousel 轮播组件 「四」用 ...

最新文章

  1. Fragment详解之四——管理Fragment(2)
  2. 每天一个linux命令cd,每天一个linux命令-cd
  3. test 7 3-22 2021省选模拟赛seven
  4. 关于c语言编写 顺序表 的创建、插入、修改、删除、显示、退出 的程序案例
  5. SpringSecurity Basic Authentication
  6. java中类和实例化_Java中类的初始化与实例化
  7. failed to accept an incoming connection: connection from 192.168.1.114 rejected, allowed hosts: 1
  8. window添加右键菜单
  9. Shell script 笔记
  10. 信号数据EMD分解+IMF时序数据LSTM预测建模实践
  11. windows系统查看md5
  12. 虚拟机安装win7时遇到的问题及解决方案
  13. JavaScript正则表达式学习笔记之一 - 理论基础
  14. XSS Filter Evasion Cheat Sheet
  15. 比普通空调好,比净化器静 海尔唯一获“空·净一体”A+认证
  16. Kafka常用命令之kafka-topics.sh
  17. Flink状态一致性检查点
  18. 社群网站广告有效了!竟是普通的陈列广告+小型线上活动
  19. 手把手写C++服务器(7):给C语言程序员看的C++科普
  20. 3d打印热床的PEI/玻璃/晶格玻璃/柔性平台/弹簧钢板如何选择

热门文章

  1. mysql频繁查询出错_Mysql数据库频繁查询错误解决方案
  2. mysql5.6.30源码安装_Centos7.1 for MySQL5.6.30源码安装及多实例配置
  3. vfp 右键发送邮件_邮件批量发送的方法教程
  4. java最全基础知识_Java编程入门,计数排序(Counting Sort)怎么做?
  5. 塑钢瓦图片_塑钢瓦和彩钢瓦哪种好 如何准确选购
  6. java读取frp_【原创】FRP初探(函数式编程部分)
  7. 计算机丢失qt4core.dll,qtcore4.;dll文件丢失。怎么办?
  8. 攻防世界(Pwn)dice_game, 栈溢出覆盖srand种子
  9. CTF-window和linux下命令执行的知识
  10. 无线路由器发起ARP攻击,致使网络中断,这是为什么?