ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: onkey

[Excel 函数与公式] [开_94] 有点难题--求回文公式.

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-3-22 22:52 | 显示全部楼层
以下是引用onkey在2006-3-22 19:34:52的发言:
qlz110和chrisfang的公式还是太长了,和我的答案有点距离。

ONKEY是使用MMULT的高手,是不是要使用MMULT啊,大家快想想。^_^

TA的精华主题

TA的得分主题

发表于 2006-3-23 14:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

根据楼主后面的要求,是要减少判断语句,我又做了一个:

IF(big=ABS(x),IF(x<=0,-4*x-y,MOD(8*big+y*SIGN(x),8*big)),MOD(8*big+y*2-x*SIGN(y),8*big))

公式做了两次判断,但其实好像公式比原来的还要长了,呵呵,不知道究竟怎样算满足题目公式又要简短,判断次数又要少的要求。献丑了!

H76yfQmj.rar (6.29 KB, 下载次数: 13)


TA的精华主题

TA的得分主题

 楼主| 发表于 2006-3-23 18:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

我的答案也是用两次判断,但长度短很多。

TA的精华主题

TA的得分主题

发表于 2006-3-24 10:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

呵呵,我现在把判断改成一个了,公式样子也简单了不少,代价就是用了n多定义。过会儿我再做个不用判断的出来,大家等等。不要学我,我正在把简单问题复杂化,不过却满足了楼主要求判断减少的要求,呵呵。

IF(big=ABS(x),dx+8*big*signdx,dy+8*big*signdy)

RDGMQsBb.rar (6.23 KB, 下载次数: 9)


TA的精华主题

TA的得分主题

发表于 2006-3-24 11:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

诺,现在是一个判断也没用的方案,用了一串定义。

=signbigx*(dx+8*big*signdx)+signbigy*(dy+8*big*signdy)

9RWulRhK.rar (6.13 KB, 下载次数: 8)

TA的精华主题

TA的得分主题

发表于 2006-3-24 22:25 | 显示全部楼层

今天晚上突发灵感,换个思路,采用圆心角度来建立模型。赶在睡觉前把公式做出来了,这次的绝对简单,只有六个定义名称,而且其中几个属于过渡类型。

定义完成后公式如下:=(j+4)*big+fu

没用任何判断语句。下面稍微解释一下,具体请看附件:

J是四个象限里45度、135度、225度、315度所对应的几个三角函数之和,它的值在四个象限分别等于-3,-1,1,3。

big当然是指x、y坐标里面较大的那个绝对值。也可类似的认为是圆心半径。

fu是指偏离45度、135度、225度、315度这些角度时对以上角度的计算补偿。

请楼主仔细看看我这个方案,是否满意?只少我自己觉得已经是最佳解法了。

dSYXaSH5.rar (6.4 KB, 下载次数: 20)

TA的精华主题

TA的得分主题

发表于 2006-3-27 09:16 | 显示全部楼层

我的做法;

D0eWSPay.rar (8.78 KB, 下载次数: 13)

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-3-27 16:12 | 显示全部楼层
以下是引用chrisfang在2006-3-24 22:25:55的发言:

今天晚上突发灵感,换个思路,采用圆心角度来建立模型。赶在睡觉前把公式做出来了,这次的绝对简单,只有六个定义名称,而且其中几个属于过渡类型。

定义完成后公式如下:=(j+4)*big+fu

没用任何判断语句。下面稍微解释一下,具体请看附件:

J是四个象限里45度、135度、225度、315度所对应的几个三角函数之和,它的值在四个象限分别等于-3,-1,1,3。

big当然是指x、y坐标里面较大的那个绝对值。也可类似的认为是圆心半径。

fu是指偏离45度、135度、225度、315度这些角度时对以上角度的计算补偿。

请楼主仔细看看我这个方案,是否满意?只少我自己觉得已经是最佳解法了。






我所想要的答案不是形式上用一些其它函数取代IF函数或比较判断,而是真正减少比较判断次数。你的答案中的每一次使用SIGN(x+0.1)或SIGN(y+0.1)只不过是为了取代IF(x>=0,1,-1)或IF(y>=0,1,-1)而已。我的答案是=IF(x<y,3*big-x-y,(y<0)*(7*big+x)+y),要用SIGN函数把两个比较判断去掉很容易,只是这样就不利于别人对公式的理解,或者不利于从文字上对算法进行描述。

TA的精华主题

TA的得分主题

发表于 2006-3-28 11:04 | 显示全部楼层
以下是引用onkey在2006-3-27 16:12:06的发言:

我所想要的答案不是形式上用一些其它函数取代IF函数或比较判断,而是真正减少比较判断次数。你的答案中的每一次使用SIGN(x+0.1)或SIGN(y+0.1)只不过是为了取代IF(x>=0,1,-1)或IF(y>=0,1,-1)而已。我的答案是=IF(x<y,3*big-x-y,(y<0)*(7*big+x)+y),要用SIGN函数把两个比较判断去掉很容易,只是这样就不利于别人对公式的理解,或者不利于从文字上对算法进行描述。

感谢楼主对我所做答案的评价,对于楼主的见解,我也有一些自己的看法,下面分两个部分进行一下说明,也是对我的算法的一个说明:(其中的图片需要放大一点看,否则有些字显示不出来)

1,首先,我认为,减少if或是其他简单的判断语句并不是一个简单的函数替换的过程。减少判断,不仅仅意味着替换,还包含了一个综合归纳的过程。

打个比方,你的公式中的(y<0)*(7*big+x)+y),就是利用了(y<0)这个判断产生01的两种结果使得下面两个判断式:

y<0,则=7*big+x+y

y>=0,则=y

综合归纳为了一个式子:=(y<0)*(7*big+x)+y)

但是同样的,你可以将前面的3*big-x-y也用某种方式和后面的(7*big+x)*(01)+y综合归纳成为一个式子吗?要知道,归纳也是一种数学、哲学上的重要技能和技巧。

我们来仔细分析一下你的公式,其实是把一个八等分的圈子分成了三个类型:

a,单元格位置落在2345的时候,公式为3*big-x-y

b,单元格位置落在678的时候,公式为7*big+x+y

c,单元格位置落在1的时候,公式为y

其实我们如果分析能力不是很强的话,可能把问题情况分得更多,比如23一种,45一种,67一种,8一种,1一种。但是楼主通过归纳和总结,最后总结出了上面的三种情况。

因为有三种情况所以用了两个判断,其中一个判断带嵌套。

我要告诉楼主的是,我的算法把你剩下的三种情况也归纳总结成为了一种,所以我没有用判断。

sign函数确实可以替代if的判断,同样得到-1,+1两个函数值,但在我的公式运用中这个函数其实不仅仅是取代if函数,更重要的是它是三角函数的一种演化(就17楼我的公式说的,前面几楼的确实只是取巧而已)。

下面就来用文字描述一下我的算法(17楼的公式),方便大家的理解

2,刚才楼主选择的基点是3*big7*big、还有一个其实就是0*big,我们在下面的图上可以看到,其实就是135度角上的369….315度角上的71428….以及那根0度线。而我选择的基点就是紫色的那四条线,即45度、135度、225度、315度四条线。我们各自这样的选择都有自己的考虑,我就不详细说明了。

下面简单说一下我的考虑,我的想法是把一圈回文看作一个圆圈,由xy轴分成四个象限。整个回文表格就可以看成一个个同心圆,圆圈的半径就相当于那个bigxy中较大的那个绝对值)。围绕这这个圆圈,我们发现单元格的值随着圆心角度的增大而有规律地增大,对于某一个半径的一个圆圈来说,它圈上的最大值只跟它的圆心被划分(注意是“划分”而不是“平分”或“等分”)的份数有关。这个份数就是8*big。于是,我就可以考虑,是不是可以构造这么一个函数,类似于一个计算圆弧长度的函数,单元格的值就等于他所在位置的半径去乘以它的圆心角度大小。这就把四个象限甚至八个区域里的多种情况统一成了一种情况,归纳成为单独的一个公式,这就是这个算法的中心思想。

当然,这里的圆心角度的大小并不是指它真正的角度值,因为圆和方毕竟不一样,同样八等分一个圆和一个正方形,相等的圆心角对应的圆弧长度是相等的而对应的正方形边长却不一样。看一下下面的图可以发现,其实我们均分的是正方形的周长,而正方形中心的角度却不是等分的。这里提的只是一个可以将方类比为圆的一个抽象概念。

但是从上图我们发现,至少在正负45度、正负135度这样的对角线上,圆和方很有可比性,在这里有我们想要的值:

当单元格位于刚才所说的那四个对角线的时候,函数值等于1357以及1357的倍数(倍数就是半径big)。1357很容易让我们产生联想,大家都减4就成了-3-1+1+3,这个就更眼熟了。大家知道45度、135度、225度、315度的sin三角函数值就是根号(1/2)、根号(1/2)、-根号(1/2)、-根号(1/2)。经过变换后可以成为11,-1,-1。那么可以通过几个三角函数的组合得到四个对角线分别为-3,-1,+1,+3的结果吗?当然可以,我们不考虑三角函数具体值的大小,只当它们的数值绝对值都为1的话,可以看到:

对应45度、135度、225度、315度的时候:

sin 1 1 1 1

tan 1 1 1 1

那么就有-2×sintan=-3,-1,+1,+3,再加上4就成了1357了。这就是我选择四条对角线的为基点的原因所在。

要把类三角函数转化为我们需要的公式,因为我们不需要xy的具体数值,只要他们返回+1或者-1就行了,所以我采用了sign函数。『现在可以发现,其实我用sign函数并不是替换if函数,而是替换"y/︱y︱"或是"x/︱x︱"这样的式子,因为除法有个除数不能为零的禁忌,所以用sign函数来替代比较好些。』 三角函数Siny/根号(x2y2),其实就是取了y的符号,tany/x,其实就是取了(y的符号/x的符号)。所以这部分公式就是j=-2*SIGN(y)-SIGN(x)*SIGN(y) ,它的函数值在我们划分的四个象限里面就分别等于-3、-1、+1、+3了。(因为当xy0的时候,sign会返回0值,我们不需要这个0,所以我在实际公式的编写中这部分改成了j=-2*SIGN(y+0.1)-SIGN(x+0.1)*SIGN(y+0.1)

好,下面看一下不在对角线上的情况。当单元格不是刚好落在对角线上而是落在对角线的边上,那些函数值也有一个规律:它的值就是离它最近的那根对角线加上或减去一个补偿值,那个补偿值的就是︱x︱-︱y︱的绝对值。打个比方,比如座标(-32),离它最近的是135度角,半径是3,所以对应对角线上的值是9,它的补偿值是︱-3︱-︱2︱的绝对值就是19加上1就是这个单元格的值10。至于补偿值何时该加何时该减,我们现在来分析一下。

第一张图:就是补偿值在8个区域里的符号。

第二张图:做过这道题目初步分析的朋友应该对︱y︱-︱x︱在8个区域里的符号很熟悉了。

第三张图:把第二张图变到第一张图,只需再乘上一个类tan函数就行了。

tan函数和上面的做法一样,就是sign(x)*sign(y),所以补偿值这部分的公式可以写成:fu(ABS(y)-ABS(x))*SIGN(x)*SIGN(y)(在实际公式应用中,采用sign(x+0.1)*sign(y+0.1)

归纳而成的公式就是这样:=(j4*bigfu,其中j4就是那个1357的基准值,*big就是乘上半径,+fu就是加上补偿值了。这个公式也可以看作是个类似求圆弧长度的公式,j44个基准角度,补偿值可以看作偏离45度角时的算法,因为方形不同于圆形的等分,角度增大和边长增大并非常规线性关系,所以才会有补偿值的算法。

这就是我的算法的阐述了,如果楼主或是大家能够看懂我写的这些东西的话,应该多少可以理解一些我下面的这句话了:

公式的优劣并不完全在于公式的长短或是使用判断的多少,而是在于含义结构的清晰、对问题分析归纳的彻底以及对现有函数尽可能简单的应用。

再次感谢大家能够看完我的文字。




[此贴子已经被作者于2006-3-28 21:17:48编辑过]
qRavloTa.jpg
vMwamB2M.jpg
Kd2eDKWZ.jpg
Kldqx3Ak.jpg
WE5aGmib.jpg
Nm7a41Cn.jpg

TA的精华主题

TA的得分主题

发表于 2006-3-28 14:24 | 显示全部楼层

chrisfang 朋友分析的很好,题目本身就有很多解法,从不同的角度出发,过程就会不一样,各有千秋:

1、比如从225度出发,分别向两个方向递增、递减,解法如下:

4jv3IZot.rar (7.96 KB, 下载次数: 17)

至于是否使用if()或者用sign()来判断符号的正负纯属个人对函数运用的喜好,不能作为问题的讨论焦点。

[此贴子已经被作者于2006-3-29 9:35:09编辑过]

oA6slksD.rar

7.48 KB, 下载次数: 11

[函数41] 有点难题--求回文公式.

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-23 14:47 , Processed in 0.060999 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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