给大伙整道题娱乐一下
excel吧
全部回复
仅看楼主
level 13
生成2到100000(10万)内的所有质数的序列。尽量计算的快一些,不要卡太久。
参考信息:查质数表可知,2到316(100000^0.5)内一共有65个质数;2到100000内一共有9592个质数;范围内最大的质数为99991。
2024年01月28日 16点01分 1
level 13
还有个要求没说:必须用公式,结果必须是数组,如图所示[滑稽]
2024年01月28日 16点01分 2
level 12
reduce/filter+map
2024年01月28日 22点01分 3
level 7
=LET(zhishu,LAMBDA(num,REDUCE(num,SEQUENCE(ROUNDUP(num^0.5,0)-1,,2),LAMBDA(a,b,IF(a<>"",IF(MOD(a,b)=0,"",a),"")))),beixuan,LAMBDA(a,FILTER(SEQUENCE(a),VSTACK({0;1;1;0;1;0},--(ABS(SEQUENCE(a-6)-ROUND(SEQUENCE(a-6)/6,0)*6)=1)))),r,MAP(beixuan(100000),LAMBDA(a,zhishu(a))),VSTACK({2},FILTER(r,r<>"")))
2024年01月29日 01点01分 5
@caulen 六筛法,备选的序列可以优化一下:vstack(2,3,let(a,sequence(33332,,5,3),a-iseven(a)))
2024年01月29日 03点01分
level 14
2024年01月29日 02点01分 6
vba解法在精品贴也有,编程的话对于这个问题已经优化的很成熟了[滑稽]所以想看看公式解法
2024年01月29日 03点01分
level 7
优化了一下,感觉差不多还能快1秒左右
=LET(zhishu,LAMBDA(num,REDUCE(num,IF(SEQUENCE(ROUNDUP(num^0.5/2,0),,,2)=1,2,SEQUENCE(ROUNDUP(num^0.5/2,0),,,2)),LAMBDA(a,b,IF(a<>"",IF(MOD(a,b)=0,"",a),"")))),beixuan,LAMBDA(a,FILTER(SEQUENCE(a),VSTACK({0;1;1;0;1;0},--(ABS(SEQUENCE(a-6)-ROUND(SEQUENCE(a-6)/6,0)*6)=1)))),r,MAP(beixuan(100000),LAMBDA(a,zhishu(a))),VSTACK({2},FILTER(r,r<>"")))
2024年01月29日 03点01分 7
level 11
太难了[泪],把我软件都卡到无响应了,不玩了。
打个卡,等后面来学习。
2024年01月29日 04点01分 8
其实不难,一行以内能解决[滑稽]提示一下,那个65是有用的
2024年01月29日 04点01分
level 13
2024年01月29日 04点01分 9
level 13
穷举一个,好耗费电脑资源。
2024年01月29日 05点01分 10
可以先用六筛法剔掉2/3的数,能快不少
2024年01月29日 06点01分
@🎶虚空蛋黄酱 谢谢指教,初中学历,确实不懂算法。
2024年01月29日 06点01分
level 11
2024年01月29日 05点01分 11
level 14
应该不会太卡=TOCOL(MAP(ROW(2:100000),LAMBDA(x,IF(MIN(MOD(x,SEQUENCE(INT(x^0.5),,2)))+(x<4),x,凶))),2)
2024年01月29日 07点01分 12
算法看懂了,但是效率看不懂,感觉一个一个判断,连偶数都没排除为啥会这么快,难道筛选的过程反而浪费效率[黑线]
2024年01月29日 07点01分
@caulen [大拇指]min和x<4,用的妙,受教了~
2024年01月29日 08点01分
level 14
=LET(s,ROW(2:100000),FILTER(s,MAP(s,LAMBDA(x,MIN(MOD(x,SEQUENCE(x^0.5,,2)))+(x<4)))))
2024年01月29日 07点01分 13
level 13
我来写我的了[滑稽]
=reduce(row(2:99999),row(1:65),lambda(s,n,let(a,index(s,n),filter(s,mod(s,a)+(s=a)))))
非常快,几乎是秒出结果[滑稽]
原理是埃拉托斯特尼筛法,每次筛掉数列里能被第n小的数整除的数但保留它本身,直到要判断的数大于最大数的平方根。这里用filter来筛选,用reduce做迭代计算,因为2到316一共有65个质数,所以至少迭代65次。
2024年01月29日 09点01分 14
看懂了,这个是真快,但感觉要先知道65,有点不完美,要是有变量和append就舒服了,这65搞得我强迫症都犯了~
2024年01月29日 09点01分
@caulen 这个好说,再筛一次2到316就行,数一数就知道迭代次数是7次(小于18的质数,2,3,5,7,11,13,17),得出这个范围内有65个质数
2024年01月29日 09点01分
level 1
谁能教教我[泪][泪],我有好几题不会[泪][泪]
2024年02月07日 09点02分 15
1