如何快速解决欧拉计划第三题:素数问题

翻译成中文,第三题的题目是这样的:

13195的质数因子有5,7,13和29.

600851475143的最大质数因子是多少?

当然这个题目的思路是很简单的

第一:找出他所有的因数,

第二:看他的因数是不是质数;

但是这里要求程序在一分钟内得到结果,

我先来看我最初的设计:


use strict;
use warnings;
use bignum;
my $num;
my $i;
my $cout=2;

while($cout<300425737571)
{

	if(0==600851475143%$cout)
	{
		print $cout."\n";
	}
	$cout++;
}

这里先找的是她的因数;结果电脑运行了一晚上,还没有得到最后的结果,如下:

C:\WINDOWS\system32\cmd.exe /c perl "F:\perl\c.
71
839
1471
6857
59569
104441
486847
1234169
5753023
10086647
87625999

那么这样做到底可行吗?其实我们可以通过一个简单的修改达到大大减小运行时间;

其实我们在得到71这个因数的同时,我们也得到了另一个因数:8 462 696 833。这里我们可以得出最大的因数是8462696833.所以我们循环的时候把这一点加上。

use strict;
use warnings;
use bignum;
my $num;
my $i;
my $cout=2;
my $another;


while($cout<300425737571)
{

	if(0==600851475143%$cout)
	{
		$another = 600851475143/$cout;
		if($another<$cout)
		{
			last;
		}
		else
		{
			print "$cout\n";
			print "$another\n";
		}
	}
	$cout++;
}

速度快多了,因为我们从结果中看,只要跑到1234169就会终止运行。越往后,运行的时间就会指数倍的增长。

C:\WINDOWS\system32\cmd.exe /c perl "F:\perl\c.pl"
71
8462696833
839
716151937
1471
408464633
6857
87625999
59569
10086647
104441
5753023
486847
1234169
Hit any key to close this window...
然后我们再来筛选质数就可以了。

use strict;
use warnings;

my @num;
my $cout=0;
my $num;
my $i;

@num=qw/71 839 1471 6857 87625999 59569 10086647 104441 5753023 486847 1234169 408464633 716151937 8462696833 /; 
foreach $num(@num)
{
	for($i=2;$i<$num**0.5;$i++)
	{
		if(0==$num%$i)
		{
			$cout=1;
			last;
		}
	}
	print "$num\n" if($cout==0);
}


结果如下:


C:\WINDOWS\system32\cmd.exe /c perl "F:\perl\c.pl"
71
839
1471
6857
Hit any key to close this window...
所以最后的结果是6875.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值