Project Euler

本文解析了Project Euler上的几道数学编程题,包括求最大素因子、寻找由两个三位数相乘得到的最大回文数及计算前100个自然数的和的平方与平方的和的差等,并提供了相应的编程思路与代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近发现了一个很有趣的网站,Project Euler

上面全是数学题,不过大多需要用编程解决

Problem 3:

求:600851475143的最大素因子。

解:编了个程序,迅速水过,看官方的题解,加了一些优化。其实可以打个素数表继续优化。

 

2010083121444743.png

 

Problem 4:

求:由两个三位数相乘得到的最大的回文数(P = a*b)。

解:枚举100~999,判断成绩是否是回文数,求出最大的一个。

改进一:可假设a<=b,且循环从999开始递减进行。

改进二:由111111 = 143*777,可知P为六位数,设:

P = 100000x + 10000y + 1000z + 100z + 10y + x

P = 100001x + 10010y + 1100z

p = 11(9091x + 910y + 100z)

则a,b中至少有一个是11的倍数,由此可在进一步限制迭代条件,进行加速。

 

ContractedBlock.gif ExpandedBlockStart.gif 代码

   
1 Problem 4 :
2 function reverse(n)
3 reversed = 0
4 while n > 0
5 reversed = 10 * reversed + n mod 10
6 n = n / 10
7 return reversed
8
9 function isPalindrome(n)
10 return n = reverse(n)
11
12 largestPalindrome = 0 ;
13 a = 999
14   while a >= 100
15 if a mod 11 = 0
16 b = 999
17 db = 1
18 else
19 b = 999 // The largest number less than or equal 999
20   db = 11 // and divisible by 11
21  
22 while b >= a
23 if a * b <= largestPalindrome
24 break
25 if isPalindrome(a * b)
26 largestPalindrome = a * b
27 b = b - db
28 a = a - 1
29
30 output largestPalindrome

 

Problem 6:

求:Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.

  前100个自然数的和的平方与平方的和的差。

解:两个公式。

2010090212375188.png

 

Problem 7:

求:第10001个素数

解:1.素数筛选法。

2. 改进的素数判定法,根据:

[1].所有的素数除了2都是奇数,

[2].所有比3大的素数都可以写成6k+1 或6k-1的形式,

[3].任何一个数n至多有一个比2010090310015655.png大的素因子。

 

ContractedBlock.gif ExpandedBlockStart.gif p7

   
// 经验证:f=5, {f,f+2|f+=6} 可以涵盖所有的素数
Function isPrime(n)
if n = 1 then return false
else
if n < 4 then return true
else
if n mod 2 = 0 then return false
else
if n < 9 then return true
else
if n mod 3 = 0 then return false
else
r
= floor(sqrt(n))
f
= 5
while f <= r
if n mod f = 0 then return false
if n mod (f + 2 ) = 0 then return false
f
= f + 6
endwhile
return true
End Function

 

 

转载于:https://www.cnblogs.com/superbin/archive/2010/08/31/1814058.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值