Minecraft(我的世界)中文论坛

 找回密码
 注册(register)

!header_login!

只需一步,立刻登录

查看: 1259|回复: 9

[命令方块] [没卵用]一条命令辗转相除

[复制链接]
发表于 2016-5-30 22:40:00 | 显示全部楼层 |阅读模式

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
注意,这里的一条命令是真的一条命令不是OOC啊!

各位好,又是我pca怪蜀黍,今天又来向大家宣传丧病的execute神教啦~

辗转相除法就是透过两个数互相取余,当其中一个变为0的时候,另外一个数字就是两个数字之间的最大公因数了举个例子,a=120和b=50
a=a%b=120%50 = 20
b=b%a=50%20 = 10
a=a%b=20%10 = 0
所以他们两个之间的最大公因数就是10

由此我们可以推断出一个很简单的算法:
  1. while a和b都不是0:
  2.     if 上次是a%=b:
  3.         b %= a
  4.     else:
  5.         a %= b
复制代码

当然,这个并不是任何编程语言啦~ 只是为了理清我们的逻辑

好了,问题来了,我们要如何做到while呢?
这里我们用了一个取巧的方法,也就是接近穷举的方法: 一大堆execute @e[tag=xxx]
这里要先说明一下,tag=xxx的只能有两个,而且要是拥有该两个分数的实体,这是为了在一条命令里能做到两个轮流执行才做出的调整
有什么用途呢?比如说你有2个实体,一个execute @e就是2次,两个就是2^2=4次,三个就是2^3=8次,如此类推
很快就能做到大量的执行次数
当然,为了能够避免大量无用的执行,我们也需要加上限制,就是只选择分数>=1的实体执行,这样子就可以省略大量的运算了

然后,相除的地方就是
  1. scoreboard players operation @e[tag=xxx,c=1] scb %= @e[tag=xxx,c=-1] scb
复制代码

比如说现在执行的是a,c=1选择到的自然是a,至于tag=xxx,c=-1选择到的就一定是b了,反之亦然

很简单对吧!然而这样子优化还是不足,我们需要多几个命令来进行优化
  1. execute @e[tag=xxx,r=0,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,c=-1] ~ ~ ~ execute @e[r=0,score_scb_min=1,tag=xxx] ~ ~ ~
复制代码
可能看起来很白痴吧,加上几个没什么用的命令。其实不然,这四个命令就是检测两个实体是否分数都大于0(先指定选择该实体,然后检查分数),不符合的话自动就会跳过此次执行
在实际执行上看来,分数运算需要的时间是大于选择实体的,所以这个命令是能够进行小幅度的优化的

这就是成品:
  1. execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,r=0,score_scb_min=1] ~ ~ ~ execute @e[tag=xxx,c=-1] ~ ~ ~ execute @e[r=0,score_scb_min=1,tag=xxx] ~ ~ ~ scoreboard players operation @e[tag=xxx,c=1] scb %= @e[tag=xxx,c=-1] scb
复制代码




来自群组: Command Block Logic

评分

参与人数 8人气 +6 金粒 +36 收起 理由
Ttttt... + 1 你用的是CP?或者FPC?
小草—c_t_l + 1 可以,这很exe
火星渣渣 + 2 哇哇哇楼主您是c++还是fpc
siebo + 2 看不怎么懂......
kongbaiyo + 1 + 15 令人恐惧的execute
840196733mw + 2 啪叽 膝盖掉了
acordome + 1 + 15 评分神教走起
chyx + 2 很棒的作品!

查看全部评分

回复

使用道具 举报

发表于 2016-5-30 23:17:10 | 显示全部楼层
看标题推出lz高一.

评分

参与人数 1人气 +1 收起 理由
chyx + 1 WAI

查看全部评分

回复

使用道具 举报

发表于 2016-5-30 23:23:34 | 显示全部楼层
LZ高一
一楼高中
肯定没错
辗转相除是公元前300年的方法了....
真没卵用...

点评

更相减损?不是更老吗,分解质因数还是需要穷据质数的……  详情 回复 发表于 2016-9-8 11:07
回复

使用道具 举报

发表于 2016-5-31 20:43:35 | 显示全部楼层
你在说什么,我根本看不懂怎么办
还有至于写while和if么……万一有人看不懂怎么办
回复

使用道具 举报

发表于 2016-5-31 21:40:22 | 显示全部楼层
至于写while if么{:10_493:}没看文字的时候差点以为是java代码{:10_495:}
最近在学javaHHHH
回复

使用道具 举报

发表于 2016-6-1 18:24:31 | 显示全部楼层
楼上的pcb语言都不懂(手动滑稽)

不管看不看的懂 先交膝盖再说
回复

使用道具 举报

发表于 2016-9-3 16:14:01 | 显示全部楼层
cheng000 发表于 2016-5-30 03:17
看标题推出lz高一.

额辗转相除我四年级就会了

点评

哇塞,兄弟好厉害, 让在下这个渣渣去死吧~haha  详情 回复 发表于 2016-9-3 21:20
回复

使用道具 举报

发表于 2016-9-3 21:20:02 | 显示全部楼层
Ttttt... 发表于 2016-9-3 16:14
额辗转相除我四年级就会了

哇塞,兄弟好厉害,    让在下这个渣渣去死吧~haha{:10_494:}
回复

使用道具 举报

发表于 2016-9-8 11:06:53 | 显示全部楼层
神?Execute嵌套
回复

使用道具 举报

发表于 2016-9-8 11:07:58 | 显示全部楼层
E100撞老鼠 发表于 2016-5-30 23:23
LZ高一
一楼高中
肯定没错

更相减损?不是更老吗,分解质因数还是需要穷据质数的……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 手机版本

GMT+8, 2017-9-24 18:42 , Processed in 0.226344 second(s), 7 queries , Memcache On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标。本站与Mojang以及微软公司没有从属关系。

© 2010-2017 我的世界中文论坛 版权所有。本站原创图文内容版权属于原创作者,未经许可不得转载。

快速回复 返回顶部 返回列表