Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
NotificationsYou must be signed in to change notification settings

vitrumhome/24point

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

24点--是一项极为有益的活动。它以自己独具的数学魅力和丰富的内涵正逐渐被越来越多的人们所接受。这种游戏方式简单易学,能健脑益智。24点是把4个整数(一般是正整数)通过加减乘除运算,使最后的计算结果是24的一个数学游戏可以考验人的智力和数学敏感性。棋牌类益智游戏,要求结果等于二十四,一起来玩玩吧!这个游戏用扑克牌更容易来开展。拿一副牌,抽去大小王后(初练也可以把J/Q/K也拿去),剩下1~10这40张牌(以下用1代替A)。任意抽取4张牌(称为牌组),用加、减、乘、除(可加括号)把牌面上的数算成24。每张牌必须且只能用一次。如抽出的牌是3、8、8、9,那么算式为(9-8)×8×3=24。

游戏内容

24点是把4个 整数(一般是 正整数)通过 加减乘除运算,使最后的计算结果是24的一个 数学游戏可以考验人的智力和数学敏感性。

通常是使用 扑克牌来进行游戏的,一副牌中抽去大小王后还剩下52张(如果初练也可只用1~10这40张牌),任意抽取4张牌(称为牌组),用加、减、乘、除(可加括号)把牌面上的数算成24。每张牌必须且只能用一次,如抽出的牌是3、8、8、9,那么算式为(9—8)×8×3或3×8÷(9—8)或(9—8÷8)×3等。

普通算方法技巧

“算24点”作为一种 扑克牌智力游戏,还应注意计算中的技巧问题。计算时,我们不可能把牌面上的4个数的不同组合形式——去试,更不能瞎碰乱凑。这里向大家介绍几种常用的、便于学习掌握的方法:

1.利用3×8=24、4×6=24 、12×2=24求解。

把牌面上的四个数想办法凑成3和8、4和6、12和2再相乘求解。如3、3、6、10可组成(10-6÷3)×3=24或(10-3-3)×6=24。又如2、3、3、7可组成(7+3-2)×3=24等。实践证明,这种方法是利用率最大、命中率最高的一种方法。

2.利用0、1的运算特性求解。

如3、4、4、8可组成3×8+4—4=24等。又如4、5、J、K可组成11×(5—4)+13=24等。

3.在有解的牌组中,用得最为广泛的是以下六种解法:(我们用a、b、c、d表示牌面上的四个数)

①(a—b)×(c+d)

如(10—4)×(2+2)=24等。

②(a+b)÷c×d

如(10+2)÷2×4=24等。

③(a-b÷c)×d

如(3—2÷2)×12=24等。

④(a+b-c)×d

如(9+5—2)×2=24等。

⑤a×b+c—d

如11×3+l—10=24等。

⑥(a-b)×c+d

如(4—l)×6+6=24等。

例题

例题1:

3388:解法8/(3-8/3)=24 按第一种方法来算,我们有8就先找3,你可能会问这里面并没有3,其实除以1/3,就是乘3.

例题2:

5551:解法5*(5-1/5) 这道题型比较特殊,54.8算是比较少见,一般的简便算法都是38,212,46,15+9,25-1,但5*4.8也是其中一种一般情况下,先要看4张牌中是否有2,3,4,6,8,Q,

如果有,考虑用乘法,将剩余的3个数凑成对应数。如果有两个相同的6,8,Q, 比如已有两个6,剩下的只要能凑成3,4,5都能算出24,已有两个8,剩下的只要能凑成2,3,4,已有两个Q,剩下的只要能凑成1,2,3都能算出24,比如(9,J,Q,Q)。如果没有2,3,4,6,8,Q,看是否能先把两个数凑成其中之一。总之,乘法是很重要的,24是30以下公因数最多的整数。

(2)将4张牌加加减减,或者将其中两数相乘再加上某数,相对容易。

(3)先相乘再减去某数,有时不易想到。例如(4,10,10,J)(6,10,10,K)

(4)必须用到乘法,且在计算过程中有分数出现。有一个规律,设4个数为a,b,c,d。必有ab+c=24或ab-c=24 d=a或b。若d=a 有a(b+c/a)=24 或 a(b-c/a)=24 如最常见的(1,5,5,5),

(2,5,5,10)因为约分的原因也归入此列。(5,7,7,J)

(4,4,7,7)(3,3,7,7)等等。(3,7,9,K)是个例外,可惜还有另一种常规方法,降低了难度。只能用此法的只有10个。

(5)必须用到除法,且在计算过程中有分数出现。这种比较难,比如(1,4,5,6),(3,3,8,8)(1,8,Q,Q)等等。只能用此法的更少,只有7种。

(6)必须用到除法,且在计算过程中有较大数出现,不过有时可以利用平方差公式或提公因数等方法不必算出这个较大数具体等于几。比如(3,5,7,K),(1,6,J,K)等等。只能用此法的只有16种。

(7)最特殊的是(6,9,9,10),9*10/6+9=24,9是3的倍数,10是2的倍数,两数相乘的积才能整除6,再也找不出第二个类似的只能用此法解决的题目了。

需要说明的是:经计算机准确计算,一副牌(52张)中,任意抽取4张可有1820种不同组合,其中有458个牌组算不出24点,如A、A、A、5。 有1362个牌组算得出24点。

当然在一些喜欢数学的玩家而言,组合中部分无法计算出24点的组合:如之前举出的如:A、A、A、5, 2、3、3、5, 可以通过幂次方的方式计算得出24点。

例一: A、A、A、5

计算方法:5的2次方减1 (要点:A+A=2)

例二: 2、3、3、5

计算方法一 3的2次方加15 (要点:3*5等于15)

计算方法二 5的2次方减1 (要点:3/3=1)

计算方法三 3的3次方减3 (要点:5-2=3)

穷举法解24点游戏

24点游戏:

输入:n1,n2,n3,n4

输出:若能通过+ - * / 和括号混合运算,得到运算结果为24,则输出一个对应的运算表达式

穷举法:

对4个数字全排列有4!=24种排列。

4个数字共需要3个运算符,同一个运算符可以重复出现,则有4x4x4=64种情况。

对于4个数字而言,共有以下5中加括号的方式:

(A(B(CD))),(A((BC)D)),((AB)(CD)),((A(BC))D),(((AB)C)D)。

所以遍历的表达式最多有24645=7680种。即使采用逆波兰表达式,总数不变。

/*24点游戏算法,穷举法: const opt = {生成3步运算的所有组合}const suffixes = {设置三步运算的5种逆波兰表达式}let workedList = {成功表达式}if(a,b,c,d){    let myNumber = {生成输入4个数字的所有排序}    let list; 表达式数组 如 ["8", "8", "4", "4", "+", "+", "+"]    foreach(myNumber){        foreach(opt){            foreach(suffixes){                1、list 拼接数字和运算符号表达式数组                2、计算表达式值 RPN(list)                3、如果能求得24,记录翻译后的表达式并返回            }        }     }}if (workedList.lenght > 0){    循环展示表达式}else{    这个数字组合无解}*/

运算思路

1、采用逆波兰表达式,记录并运算所有穷举算式

  • (A(B(CD))) => A B C D op3 op2 op1
  • (A((BC)D)) => A B C op2 D op3 op1
  • ((AB)(CD)) => A B op1 C D op3 op2
  • ((A(BC))D) => A B C op2 op1 D op3
  • (((AB)C)D) => A B op1 C op2 D op3
// 根据算出的逆波兰表达式,计算这次4个数字的排序求值function RPN(array) {    var i = 0;    var length = array.length;    var isBreak = false;    var value = 0;    var operatorList = {'+' : '', '-' : '', '*': '', '/':''};    for (; i < length; i++) {        if(array[i] in operatorList){            array.splice(i - 2, 3, eval('' + parseFloat(array[i - 2]) + array[i] + parseFloat(array[i - 1])));            break;        }    }    console.log('RPN',array);    if(array.length>1){        return RPN(array);    }else{        return array[0];    }}

2、配置设置,是否包含11/12/13,是否包含小数负数

参考资料

浅析JavaScript引擎的技术变迁

http://djt.qq.com/article/view/489

逆波兰算术表达式解析的JavaScript实现

http://huangyuanmu.iteye.com/blog/435938

如何用js实现中缀表达式转后缀表达式然后求值

https://segmentfault.com/q/1010000000664346

24点游戏

http://www.baike.com/wiki/24%E7%82%B9%E6%B8%B8%E6%88%8F

后缀表达式转换为中缀表达式

http://www.cnblogs.com/unixfy/archive/2013/08/19/3269071.html

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

[8]ページ先頭

©2009-2025 Movatter.jp