欧拉计划第四题:关于求回文数。第五题,第六题,第七题,第八题,第九题,第十题

第四题:回文数问题

A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 99.

Find the largest palindrome made from the product of two 3-digit numbers.

一个回文数指的是从左向右和从右向左读都一样的数字。最大的由两个两位数乘积构成的回文数是9009 = 91 * 99.
找出最大的有由个三位数乘积构成的回文数。

这个题目难度不大,写一个小程序就OK了,

思路分为两步:

第一:因为999*999=998001,所以从998001开始向前,找回文数,因为我们要的是最大的,所以从大往小找

第二:找到以后验证是否是两个三位数的乘积,这里的验证也是从大往小,看看能不能被999整除,如果能,检查商是不是三位数,如果是,那么结果就出来了。

一下为程序:

use strict;
use warnings;

my $i;
my $flag;
my $num;
for($i=998001;$i>100000;$i--)
{
	$num=$i;
	my $six=(int($num/100000));
    my $five=(int($num/10000)-10*int($num/100000));
    my $four=(int($num/1000)-10*int($num/10000));
    my $three=(int($num/100)-10*int($num/1000));
    my $two=(int($num/10)-10*int($num/100));
    my $one=($num-10*int($num/10));
	if($six==$one && $five==$two && $four==$three)
	{
		my $cout=999;
		for($cout=999;$cout>100;$cout--)
		{
			if(0==$num%$cout)
			{
				my $another=$num/$cout;
				if($another>100 && $another<999)
				{
					print "$num = $cout X $another \n"; 
					$flag=1;
					last;
				}
			}
		}
		last if $flag==1;
	}
}

结果如下:

C:\WINDOWS\system32\cmd.exe /c perl "F:\perl\c.pl
906609 = 993 X 913
Hit any key to close this window...



第五题:整除问题

题目如下:

2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?

2520是最小的能被1-10中每个数字整除的正整数。

最小的能被1-20中每个数整除的正整数是多少?


这里的第二题其实都不用谢程序的,直接拿个计算器算一下就好了,

如下:

$i=2*3*2*5*7*2*3*11*13*2*17*19;
print $i."\n";

结果如下:

C:\WINDOWS\system32\cmd.exe /c perl "F:\perl\c.pl"
232792560
Hit any key to close this window...



第六题:平方和,和的平方

题目如下:

The sum of the squares of the first ten natural numbers is,

1 2 + 2 2 + ... + 10 2 = 385(平方和)

The square of the sum of the first ten natural numbers is,

(1 + 2 + ... + 10) 2 = 55 2 = 3025(和的平方)

Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025  385 = 2640.(和的平方-平方的和=?)

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

求1到100 和的平方-平方的和=?

程序如下:

use strict;
use warnings;

my $sum=0;
my $sum_square=0;
my $square_sum=0;
my $cout;
my $difference;

for($cout=1;$cout<101;$cout++)
{
	$square_sum=$square_sum+$cout*$cout;
	$sum=$sum+$cout;
}
$sum_square=$sum*$sum;
$difference=$square_sum-$sum_square;
print "$difference = $square_sum-$sum_square\n";

结果如下:

C:\WINDOWS\system32\cmd.exe /c perl "F:\perl
-25164150 = 338350-25502500
Hit any key to close this window...



第七题:第10001个素数

题目如下:

By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.

What is the 10 001st prime number?

也就是着第10001个素数:

程序如下:

use strict;
use warnings;

my $cout=1;
my $flag=0;
my $i;
for($i=3;;$i+=2)#这里是间隔2,这样可以节省一半的时间
{
	foreach(2..$i**0.5)
	{
		if(0==$i%$_)
		{
			$flag=1;
			last;
		}
		else
		{
			next;
		}
	}
	$cout=$cout+1 if($flag==0);
	$flag=0;
	if($cout==10001)
	{
		print "$i\n";
		last;
	}
}



结果如下:

C:\WINDOWS\system32\cmd.exe /c perl "F:\perl\c.pl"
104743
Hit any key to close this window...


第八题:找出以下这个1000位的整数中连续5个数字的最大乘积

这个题目非常的长:

如下:

找出以下这个1000位的整数中连续5个数字的最大乘积。(例如前五个数字的乘积是7*3*1*6*7=882)


73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

思路其实很简单:

我们把所有的数放在一个数组里,然后从第一个元素开始依次相乘,并将得到的结果进行比较,大的留下。

这里要说的把1000个数中间都加一个空格,然后变成数组,用vim的宏就很简单的完成了。

程序如下:

my $big=0;
my $sum=0;
my @num=qw/7 3 1 6 7 1 7 6 5 3 1 3 3 0 6 2 4 9 1 9 2 2 5 1 1 9 6 7 4 4 2 6 5 7 4 7 4 2 3 5 5 3 4 9 1 9 4 9 3 4 9 6 9 8 3 5 2 0 3 1 2 7 7 4 5 0 6 3 2 6 2 3 9 5 7 8 3 1 8 0 1 6 9 8 4 8 0 1 8 6 9 4 7 8 8 5 1 8 4 3 8 5 8 6 1 5 6 0 7 8 9 1 1 2 9 4 9 4 9 5 4 5 9 5 0 1 7 3 7 9 5 8 3 3 1 9 5 2 8 5 3 2 0 8 8 0 5 5 1 1 1 2 5 4 0 6 9 8 7 4 7 1 5 8 5 2 3 8 6 3 0 5 0 7 1 5 6 9 3 2 9 0 9 6 3 2 9 5 2 2 7 4 4 3 0 4 3 5 5 7 6 6 8 9 6 6 4 8 9 5 0 4 4 5 2 4 4 5 2 3 1 6 1 7 3 1 8 5 6 4 0 3 0 9 8 7 1 1 1 2 1 7 2 2 3 8 3 1 1 3 6 2 2 2 9 8 9 3 4 2 3 3 8 0 3 0 8 1 3 5 3 3 6 2 7 6 6 1 4 2 8 2 8 0 6 4 4 4 4 8 6 6 4 5 2 3 8 7 4 9 3 0 3 5 8 9 0 7 2 9 6 2 9 0 4 9 1 5 6 0 4 4 0 7 7 2 3 9 0 7 1 3 8 1 0 5 1 5 8 5 9 3 0 7 9 6 0 8 6 6 7 0 1 7 2 4 2 7 1 2 1 8 8 3 9 9 8 7 9 7 9 0 8 7 9 2 2 7 4 9 2 1 9 0 1 6 9 9 7 2 0 8 8 8 0 9 3 7 7 6 6 5 7 2 7 3 3 3 0 0 1 0 5 3 3 6 7 8 8 1 2 2 0 2 3 5 4 2 1 8 0 9 7 5 1 2 5 4 5 4 0 5 9 4 7 5 2 2 4 3 5 2 5 8 4 9 0 7 7 1 1 6 7 0 5 5 6 0 1 3 6 0 4 8 3 9 5 8 6 4 4 6 7 0 6 3 2 4 4 1 5 7 2 2 1 5 5 3 9 7 5 3 6 9 7 8 1 7 9 7 7 8 4 6 1 7 4 0 6 4 9 5 5 1 4 9 2 9 0 8 6 2 5 6 9 3 2 1 9 7 8 4 6 8 6 2 2 4 8 2 8 3 9 7 2 2 4 1 3 7 5 6 5 7 0 5 6 0 5 7 4 9 0 2 6 1 4 0 7 9 7 2 9 6 8 6 5 2 4 1 4 5 3 5 1 0 0 4 7 4 8 2 1 6 6 3 7 0 4 8 4 4 0 3 1 9 9 8 9 0 0 0 8 8 9 5 2 4 3 4 5 0 6 5 8 5 4 1 2 2 7 5 8 8 6 6 6 8 8 1 1 6 4 2 7 1 7 1 4 7 9 9 2 4 4 4 2 9 2 8 2 3 0 8 6 3 4 6 5 6 7 4 8 1 3 9 1 9 1 2 3 1 6 2 8 2 4 5 8 6 1 7 8 6 6 4 5 8 3 5 9 1 2 4 5 6 6 5 2 9 4 7 6 5 4 5 6 8 2 8 4 8 9 1 2 8 8 3 1 4 2 6 0 7 6 9 0 0 4 2 2 4 2 1 9 0 2 2 6 7 1 0 5 5 6 2 6 3 2 1 1 1 1 1 0 9 3 7 0 5 4 4 2 1 7 5 0 6 9 4 1 6 5 8 9 6 0 4 0 8 0 7 1 9 8 4 0 3 8 5 0 9 6 2 4 5 5 4 4 4 3 6 2 9 8 1 2 3 0 9 8 7 8 7 9 9 2 7 2 4 4 2 8 4 9 0 9 1 8 8 8 4 5 8 0 1 5 6 1 6 6 0 9 7 9 1 9 1 3 3 8 7 5 4 9 9 2 0 0 5 2 4 0 6 3 6 8 9 9 1 2 5 6 0 7 1 7 6 0 6 0 5 8 8 6 1 1 6 4 6 7 1 0 9 4 0 5 0 7 7 5 4 1 0 0 2 2 5 6 9 8 3 1 5 5 2 0 0 0 5 5 9 3 5 7 2 9 7 2 5 7 1 6 3 6 2 6 9 5 6 1 8 8 2 6 7 0 4 2 8 2 5 2 4 8 3 6 0 0 8 2 3 2 5 7 5 3 0 4 2 0 7 5 2 9 6 3 4 5 0/;
for($i=0;$i<996;$i++)
{
	$sum=$num[$i]*$num[$i+1]*$num[$i+2]*$num[$i+3]*$num[$i+4];
	if($sum>$big)
	{
		$big=$sum;
	}
	else
	{
		next;
	}
}
print $big."\n";
结果如下:

C:\WINDOWS\system32\cmd.exe /c perl "F:\perl\c.pl"
40824
Hit any key to close this window...




第九题:找出唯一满足a+b+c=1000的毕达格斯三元组

A Pythagorean triplet is a set of three natural numbers, a  b  c, for which,

a 2 +  b 2 =  c 2

For example, 32 + 42 = 9 + 16 = 25 = 52.

There exists exactly one Pythagorean triplet for which a + b + c = 1000.
Find the product abc.

一个毕达哥拉斯三元组是一个包含三个自然数的集合,a<b<c,满足条件:

a 2 +  b 2 =  c 2

例如:32 + 42 = 9 + 16 = 25 = 52.

已知存在并且只存在一个毕达哥拉斯三元组满足条件a + b + c = 1000。

找出该三元组中abc的乘积。


程序如下:

use strict;
use warnings;

my $first;
my $second;
my $sum;

for($first=1;$first<333;$first++)
{
	for($second=$first+1;$second<500;$second++)
	{
		if($first**2+$second**2==(1000-$first-$second)**2)
		{
			print "$first X $second X(1000-$first-$second)=";
			$sum=$first*$second*(1000-$first-$second);
			print $sum."\n";
			last;
		}
		else
		{
			next;
		}
	}

}

结果如下:

C:\WINDOWS\system32\cmd.exe /c perl "F:\perl\c.pl"
200 X 375 X(1000-200-375)=31875000
Hit any key to close this window...




第十题:计算两百万以下所有质数的和。

这个题目和前面求素数的问题类似,具体的方案就不说了,直接帖代码:


use strict;
use warnings;

my $i;
my $sum=2;
my $cout;
my $flag=0;

for($i=3;$i<2000000;$i+=2)
{
	$flag=0;
	for($cout=2;$cout<$i**0.5+1;$cout++)
	{
		if(0==$i%$cout)
		{
			$flag=1;
			last;
		}
	}
	$sum=$sum+$i if($flag==0);
}
print $sum."\n";

结果如下:

C:\WINDOWS\system32\cmd.exe /c perl "F:\perl\c.pl"
142913828922
Hit any key to close this window...









你可能感兴趣的:(欧拉计划第四题:关于求回文数。第五题,第六题,第七题,第八题,第九题,第十题)