各个数位都不含9的所有8位数的倒数和是多少?贴吧神回复的算法是什么样

时间:2017-12-29 09:40:01   浏览:次   点击:次   作者:   来源:   立即下载

主要是怎么高效的判断①个数是否包含⑨ · ①种是把这个数每次都除以①⓪取余,若余数为⑨就说明含⑨;另①种是转为字符串后判断,但是这两种方法速度都比较慢,有没有比较快的方法呢?

MATLAB的:

function f = anysum(n)a = ①:⑧; b = ⓪:⑧;for i = ②:n b = b / ①⓪; a = bsxfun(@plus,a(:),b);endf = sum(b(②)./a(:));

>> timeit(@()anysum(⑧))ans = ⓪.①⑨⓪⑤⓪②②②②⓪⑨④⑧⑦⑥@云天明 :

本来是这样的:

function f = anysum(n)a = ①:⑧; b = ⓪:⑧;for i = ②:n a = bsxfun(@plus,①⓪*a(:),b);endf = sum(①./a(:));这个应该应该比较好懂,只要理解bsxfun的作用应该能看出来这里每①步是求出所有不含有⑨的i位数。例如第①次循环(i=②),①⓪*a(:)就是 (①⓪:①⓪:⑧⓪)\',从而:

>> bsxfun(@plus,(①⓪:①⓪:⑧⓪)\',⓪:⑧)ans = ①⓪ ①① ①② ①③ ①④ ①⑤ ①⑥ ①⑦ ①⑧ ②⓪ ②① ②② ②③ ②④ ②⑤ ②⑥ ②⑦ ②⑧ ③⓪ ③① ③② ③③ ③④ ③⑤ ③⑥ ③⑦ ③⑧ ④⓪ ④① ④② ④③ ④④ ④⑤ ④⑥ ④⑦ ④⑧ ⑤⓪ ⑤① ⑤② ⑤③ ⑤④ ⑤⑤ ⑤⑥ ⑤⑦ ⑤⑧ ⑥⓪ ⑥① ⑥② ⑥③ ⑥④ ⑥⑤ ⑥⑥ ⑥⑦ ⑥⑧ ⑦⓪ ⑦① ⑦② ⑦③ ⑦④ ⑦⑤ ⑦⑥ ⑦⑦ ⑦⑧ ⑧⓪ ⑧① ⑧② ⑧③ ⑧④ ⑧⑤ ⑧⑥ ⑧⑦ ⑧⑧所以循环最终求得的就是所有不含有⑨的n为数字,最后求倒数和就是结果

你说看不懂的那个版本只是把每次的①⓪*a(:)变成了b/①⓪; 因为显然a的元素个数要比b(只有⑨个元素)多很多,所以这样修改可以减少计算量

而这样计算的过只是和本来计算的结果相比缩小了①⓪^(n-①)倍,所以最终求倒数的时候将分母①也缩小①⓪^(n-①)倍,而b(②)恰好就是①⓪^(n-①),所以就用b(②)做分母了

由于浮点数计算误差这样修改会导致结果和原来的结果稍有不同,不过毕竟原来的算法本身也存在误差,所以修改导致的误差在可以接受范围内

不懂

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息