从一开始按以下方式逆时针旋转,可以形成一个边长为七的正方形螺旋:

一个有趣的现象是右下对角线上都有一个奇完全平方数,但是更有趣的是两条对角线上的十三个数中有八个数是素数(已经标红),也就是说素数占比为\(8/13\approx62\%\)。如果在上面的螺旋再加一层就可以形成一个边长为九的正文形螺旋。如果这个过程继续下去,在边长为多少的时候两条对角线上的数字中质数占比会低于10%?

分析:这道题和第二十八题非常类似,只不过二十八题是顺时针旋转,所以是右上角元素是完全平方数,而这道题是逆时针旋转,所以右下角元素是完全平方数。回忆二十八题的解题思路,我们从每一层的完全平方数开始,依次递推同一层的另外三个对角线元素的值。这道题也是一样的思路,首先观察每一层右下角的奇完全平方数,如边长为七时右下角的奇完全平方数是四十九,然后从四十九中减去六就得到左下角的对角线元素是四十三,而六恰好是边长七减去一。依次类推,我们从四十三中减去六得到左上角的对角线元素为三十七,再减去六得到右上角对角线元素为三十一。在这四个数中,右下角的完全平方数显然不是素数,所以我们只需要检测剩下三个元素是否是素数就可以了。

一般地,设每一层螺旋的边长为\(k\),显然\(k\)只能取大于一的奇数值。则这一层的右下角元素值为\(k^2\),左下角元素为\(k^2-(k-1)\),左上角元素为\(k^2-2(k-1)\),右上角元素为\(k^2-3(k-1)\)。在每一层,我们检查除右下角元素以外的其它三个元素是否为素数,假设到目前这一层为止总共在对角线上发现了\(p\)个素数,而对角线上元素共有\(2k-1\)个,则素数占比\(r=p/(2k-1)\),当\(r<0.1\)时返回\(k\)即为题目所求。代码如下:

# time cost = 276 ms ± 1.39 ms

from itertools import count
from sympy import isprime def main():
k = 0
for i in count(3,2):
a = i**2 - (i-1)
b = a - (i-1)
c = b - (i-1)
k += len([x for x in [a,b,c] if isprime(x)])
n = 2 * i - 1
if k/n < 0.1:
return i

Project Euler 58: Spiral primes的更多相关文章

  1. Project Euler:Problem 58 Spiral primes

    Starting with 1 and spiralling anticlockwise in the following way, a square spiral with side length ...

  2. Project Euler 27 Quadratic primes( 米勒测试 + 推导性质 )

    题意: 欧拉发现了这个著名的二次多项式: f(n) = n2 + n + 41 对于连续的整数n从0到39,这个二次多项式生成了40个素数.然而,当n = 40时402 + 40 + 41 = 40( ...

  3. Project Euler 21 Distinct primes factors( 整数因子和 )

    题意: 记d(n)为n的所有真因数(小于n且整除n的正整数)之和. 如果d(a) = b且d(b) = a,且a ≠ b,那么a和b构成一个亲和数对,a和b被称为亲和数. 例如,220的真因数包括1. ...

  4. Project Euler 47 Distinct primes factors( 筛法记录不同素因子个数 )

    题意: 首次出现连续两个数均有两个不同的质因数是在: 14 = 2 × 715 = 3 × 5 首次出现连续三个数均有三个不同的质因数是在: 644 = 22 × 7 × 23645 = 3 × 5 ...

  5. Project Euler 37 Truncatable primes

    题意:3797有着奇特的性质.不仅它本身是一个素数,而且如果从左往右逐一截去数字,剩下的仍然都是素数:3797.797.97和7:同样地,如果从右往左逐一截去数字,剩下的也依然都是素数:3797.37 ...

  6. Project Euler 35 Circular primes

    题意:197被称为圆周素数,因为将它逐位旋转所得到的数:197/971和719都是素数.小于100的圆周素数有十三个:2.3.5.7.11.13.17.31.37.71.73.79和97.小于一百万的 ...

  7. Python练习题 039:Project Euler 011:网格中4个数字的最大乘积

    本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...

  8. Python练习题 038:Project Euler 010:两百万以内所有素数之和

    本题来自 Project Euler 第10题:https://projecteuler.net/problem=10 # Project Euler: Problem 10: Summation o ...

  9. [project euler] program 4

    上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...

随机推荐

  1. 从0开始学FreeRTOS-1

    我们知道,(单核)单片机某一时刻只能干一件事,会造成单片机资源的浪费,而且还有可能响应不够及时,所以,在比较庞大的程序或者是要求实时性比较高的情况下,我们可以移植操作系统.因为这种情况下操作系统比裸机 ...

  2. parse_args(argsparse):python和命令行之间的交互

    初始化 假设我们创建一个“argp.py”的文件. import argparse # 引入模块 # 建立解析对象 parser = argparse.ArgumentParser() parser. ...

  3. python编程基础之十六

    for in 循环,与其说是循环不如说精确点交遍历 for 变量名 in + 迭代对象 语句A else: 语句B 作用:一次访问迭代对象中的元素并赋值给变量 循环终止时,执行else语句块,如果br ...

  4. 寻找子串位置<codevs>

    KMP板子题; 如果不会可以参考其他算法书 代码: #include<iostream> #include<stdio.h> #include<stdlib.h> ...

  5. web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 ☝☝☝

    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 学习 ...

  6. PowUp渗透脚本基本模块

    PowUp脚本也位于PowerSploit下Privesc模块下 通常,在 Windows 下面我们可以通过内核漏洞来提升权限,但是,我们常常会碰到所处服务器通过内核漏洞提权是行不通的,这个时候,我们 ...

  7. ‎Cocos2d-x 学习笔记(21.1) ScrollView “甩出”效果与 deaccelerateScrolling 方法

    1. 简介 “甩出”效果是当我们快速拖动container并松开后,container继续朝原方向运动,但是渐渐减速直到停止的效果. ScrollView的onTouchEnded方法会设置Timer ...

  8. DNS原理及解析过程详解

    相信大家在平时工作中都离不开DNS解析,DNS解析是互联网访问的第一步,无论是使用笔记本浏览器访问网络还是打开手机APP的时候,访问网络资源的第一步必然要经过DNS解析流程.下面我们将详细的给大家讲解 ...

  9. java初始化与清理

    初始化与清理 欢迎转载,转载烦请注明出处,谢谢. https://www.cnblogs.com/sx-wuyj/p/11177257.html 1.用构造器确保初始化 java中通过提供构造器,可以 ...

  10. 常用函数-Time

    #pragma pack(push,1) /* 在这中间定义的结构体,已单字节对齐 */ #pragma pack(pop) /************************************ ...