|
楼主 |
发表于 2010-4-27 16:18
|
显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
看别人倒取不重复数字
竞赛题地址:
http://club.excelhome.net/thread-547115-1-1.html
题目要求是倒取不重复数字,所以原字符不超过60个字符长度,结果如上所示
13740854845549356976591620260564
01
结果
4650219738
10
冻豆腐老师的答案如下:
=MID(10^12+SUM(RIGHT(LARGE(MATCH(ROW($1:$10)-1&"",MID(5^19&A1,100-ROW($1:$99),1),)*10+ROW($1:$10)-1,ROW($1:$10)))*10^ROW($1:$10)),3,COUNT(FIND(ROW($1:$10)-1,A1)))
从冻豆腐老师提供的答案中,我学到了以下几方面:
总思路是提取0-9共10个数字在原字符中的位置,再倒序组成一个新的字符串,最后再提取不指定长度(不重复量)的字符,得到结果.
因为不是每个数据都包含0-9,所以用了5^19得到19073486328125这样一个包含0-9的数值与原数据组合来取数.
MATCH(ROW($1:$10)-1&"",MID(5^19&A1,100-ROW($1:$99),1),)得到一组0-9在5^19&A1中的倒序的位置,其中原字符串中最后排在越后的数字现在会排得越前,再*10+ROW($1:$10)-1后,得到一组最后两位数代表0-9的位置排列数组,最后通过LARGE得出0-9中按排位从前到后的一组数,然后用RIGHT得到最后一位数,即0-9的排位,再与10^ROW($1:$10)相乘,求和.
COUNT(FIND(ROW($1:$10)-1,A1))利用了COUNT忽略错误值的特性,得到的是不重复数字的数量.
因为SUM得到的数是按0-9在原字符位置由后往前的顺序生成的,所以现在只要用MID从开始位置取不重复数的长度即可得到结果.
因为考虑到最后字符是0的情况时,由SUM生成的数中是不不包括0的,所以需要在最前面补0,所以用了10^12,生成一个13位长度的字符串,所以MID取数时也是从第3位开始. |
|