在单元格A1中输入任意长度的字母数字字符串。请使用公式返回字符串中可被3、5或7整除的位数。这里,“字符串中的数字”指的是字符串中任何长度的连续子字符串,它们可以被视为数字。例如,字符串:
XX30X5XXX42XX771
它包含13个数字:3,0,30,5,4,2,42,7,7,1,77,71,771。
因为:
3可以被3整除。
0可以被3、5或7整除。
30可以被3或5整除。
5可以被5整除。
4不能被3、5或7整除。
2不能被3、5或7整除。
42可以被3或7整除。
7可以被7整除。
7可以被7整除。
1不能被3、5或7整除。
77可以被7整除。
71不能被3、5或7整除。
71可以被3整除。
因此,字符串中可被3、5或7等分的位数是9。
那么,如何写出这个公式来求这个量呢?
先不看答案,自己试试。
公式
所需的数组公式:
=SUM(0(MMULT(IFERROR(0)(MOD(INDEX(MID(A1,Arry1,IF(1 LEN(A1)-arr y1=TRANSPOSE(Arry1),TRANSPOSE(arr y1)),N(IF(1,Arry3))),N(IF(1,Arry4))),{3,5,7})=0),0,{ 1;1;1})0))
公式分析
在公式中,Arry1、Arry2、Arry3和Arry4是定义的四个名称。
名称:Arry1。
参考位置:=row(间接(" 1:" len ($ a1)))
名称:Arry2。
参考位置:=row(间接(" 1:" len ($ a1) 2))-1。
名称:Arry3。
参考位置:=1 INT((Arry2)/LEN($A1))
名称:Arry4。
参考位置:=1 MOD((Arry2),LEN($A1))
1.首先看MID功能部分:
MID(A1,Arry1,IF(1 LEN(A1)-Arry1=转置(Arry1),转置(arr y1)))
依次解析MID函数的两个参数。
(1)对于第一个参数start_num,即Arry1:
ROW(间接(" 1:" LEN($A1)))
在单元格A1中生成从1到字符串长度的整数数组:
{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16}
(2)对于第二个参数num_chars,即:
IF(1 LEN(A1)-Arry1=转置(Arry1),转置(arr y1))
在解析这个IF语句之前,看一个常见的方法,就是简单地将这个参数指定为:
转置(Arry1),即:
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
此时,的MID功能部分是:
MID(A1,Arry1,转置(Arry1))
转换为:
MID(" XX30X5XX 42X771 ",{ 1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16},{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16})
可以看出传递给函数的两个数组是正交的:一个是单行数组(对应参数start_num),另一个是单行数组(对应参数num_chars)。这样,这两个数组将生成一个16行16列的矩阵,其中包含MID函数的所有256个可能结果。例如,生成数组的第一个元素等于MID(A1,1,1)的结果“x”,第二个元素等于MID(A1,1,2)的结果“XX”,以此类推,最终结果为:
{“X”、“XX”、“XX3”、“XX30”、“XX30X”、“XX30X5”、“XX30X5X”、“XX30X5XX”、“XX30X5XX”、“XX30X5XX”、“XX30X5XX”、“XX30X5XX 2”、“XX30X5XX”、“XX30X5XX”、“XX30X5XX”、“XX30X5XX”、“XX30X5XX”、“XX30X5XX 7”、“XX30X5XX 71”;“X”、“X3”、“X30”、“X30X”、“X30X5”、“X30X5X”、“X30X5XX”、“X30X5XX”、“X30X5XX”、“X30X5XX 4”、“X30X5XXX42”、“X30X5XXX42X”、“X30X5XX”、“X30X5XXX42XX”、“X30X5XXX42XX”、“X30X5XX 77”、“X30X5XX 42xx 71”、“X30X5XX 42xx 71”3英寸、30英寸、30X、30X5英寸、30X5X、30X5XX、30X5XX、30X5XX、30X5XX 4英寸、30X5XXX42英寸