把所有质数从小到大排列起来,前1009个质数的乘积与第2019个质数相比,哪个大?

据说,华罗庚的解法相当巧妙~


先不去揣测大师的解法,使用暴力解法先算一下.根据之前这篇相亲帖?诈骗帖?不,其实是招聘帖,稍作修改,不难得到前1009个质数及第2019个质数.

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package main

import "fmt"

func main() {

var sli []int

for i := 2; i <= 1000000; i++ {
for n := 2; n <= i; n++ {
// 当走到最后n等于i 了,则说明下面的i%n==0 && n < i 始终没有成立。说是这个数是个质数。
if n == i {
sli = append(sli, i)
}
// 当满足这个条件的时候就终止里面的循环,不用继续往下走了,因为它已经不是一个质数了。
if i%n == 0 && n < i {
break
}
}

if len(sli) == 2019 {
fmt.Println("第2019个质数为:", i)
break
}
}

fmt.Println(len(sli))

// fmt.Println(sli)

product := 1

i := 0
for i = 0; i < 1009; i++ {
product *= sli[i]
}

fmt.Println(i)
fmt.Println("前1009个质数之积是:", product)

}

输出为:

1
2
3
4
第2019个质数为: 17569
2019
1009
前1009个质数之积是: 6557633650925796802

这个问题挺神奇的。前1009个质数之积是个巨大的数字,即便是前1009个质数之和,也比第2019个质数大得多。

所以这个问题大概专门针对猜题党。以为这样的题设,答案一定是乍看之下不可能的那个。但是这么一试,立马显影。

至于大师的解法,我想即便有讨巧的办法,这么巨大的差距得出正确结果也没啥意思。应该找两个极其相近的点,如有无可能,前n个质数之和与第n+1个质数相差在10以为,甚至有无可能相等。这样题目就得到了升华~