![](/img/trans.png)
[英]Finding the largest palindrome of the product of two 3-digit numbers in Python
[英]Palindrome from the product of two 3-digit numbers
我想找到可以通过将两个3位数相乘获得的最大回文。
我首先将a和b都设为999,然后将发生的每个乘法都减小a和b。
a = 999 #Defining Variables
b = 999
for i in range (1000):
c= a*b #multiply a to b
if int(str(c)[::-1]) == c:
print c
a = a-1 #decrement the value of a
c=a*b #multiply a by the decremented a
if int(str(c)[::-1]) == c:
print c
b = b-1 #decrement b so that both a and b have been decremented
结果出现了698896、289982、94249、69696 ...,其中698896是第一个数字。 目前,我仍在尝试找出我所缺少的内容。
您不能以交替的方式减少a
和b
,因为这样会丢失像a = 999和b = 997这样的值对。
尝试嵌套循环,从999开始并向后计数。
就像是
def is_pal(c):
return int(str(c)[::-1]) == c
maxpal = 0
for a in range(999, 99, -1):
for b in range(a, 99, -1):
prod = a * b
if is_pal(prod) and prod > maxpal:
maxpal = prod
print maxpal
编辑:保罗的评论后修改了下界。
您的算法是错误的。 您将需要测试a的所有值到b的所有值,这可以通过使用两个循环(a的外部和b的内部)解决。 我还建议您将a和b用作循环索引,从而简化逻辑(使其更容易掌握)。
考虑将回文检查也移至其自身的功能,以使代码更易于理解。
我不是Python程序员,但这是我在PHP中的解决方案:
function palindrome($x) {
$x = (string) $x; //Cast $x to string
$len = strlen($x); //Length of $x
//Different splitting depending on even or odd length
if($len % 2 == 0) {
list($pre, $suf) = str_split($x, $len/2);
}else{
$pre = substr($x, 0, $len/2);
$suf = substr($x, $len/2+1);
}
return $pre == strrev($suf);
}
$max = array(0, 0, 0);
//Loop $a from 999 to 100, inclusive.
//Do the same over $b for EVERY $a
for($a = 999; $a >= 100; $a--) {
for($b = 999; $b >= 100; $b--) {
$x = $a*$b;
if(palindrome($x)) {
echo $a, '*', $b, ' = ', $x, "\n";
if($x > $max[2]) {
$max = array($a, $b, $x);
}
}
}
}
echo "\nLargest result: ", $max[0], '*', $max[1], ' = ', $max[2];
最快的方法是在最大值999x999 = 998001之前从最大的回旋下降。 997799,996699,..并检查是否可以在100..999范围内将其分为A和B。 我的代码花了2200个周期。 您的代码大约需要4K到8K周期。
Sub method3a()
iterations = 0
For a = 997 To 0 Step -1
R = a * 1000 + Val(StrReverse(a))
b = 999 ' R=b*s
s = Int(R / b)
While b >= s
iterations = iterations + 1
If R = b * s Then
Debug.Print "Result=" & R & " iterations=" & iterations
Exit Sub
End If
b = b - 1
s = Int(R / b)
Wend
Next
结束子
i = 1000000
test = 0
while test == 0:
i += -1
str_i = str(i)
if str_i[0:3] == str_i[3:][::-1]:
for j in range(100, 1000):
if i % j == 0:
if i/j < 1000 and i/j > 100:
print('Largest Palindrome: %s = %s * %s' % (i, j, i//j))
test = 1
break
在C#中-要点中的解决方案-https: //gist.github.com/4496303
公职人员{
}
public void start()
{
int MAX_NUMBER = 999;
for (int Number = MAX_NUMBER; Number >= 0; Number--)
{
string SNumberLeft = Number.ToString();
string SNumberRight = Reverse(Number.ToString());
int palindromic = Convert.ToInt32(SNumberLeft + SNumberRight);
for (int i = MAX_NUMBER; i >= 1; i--)
{
for (int l = MAX_NUMBER; l >= 1; l--)
{
if ((i * l) - palindromic == 0)
{
System.Diagnostics.Debug.WriteLine("Result :" + palindromic);
return;
}
}
}
// System.Diagnostics.Debug.WriteLine( palindromic);
}
}
public string Reverse(String s)
{
char[] arr = s.ToCharArray();
Array.Reverse(arr);
return new string(arr);
}
}
我做到了,并优化并减少了搜索步骤
时间0.03525909700010743
回文= 906609
数量= 3748
我= 913
j = 993
from timeit import timeit
def palindrome(number):
return str(number) == str(number)[::-1] # chek number is polindrome
def largest():
max_num = 0
count = 0
ccount = 0
ii = 0
jj = 0
for i in range(999, 99, -1): # from largest to smallest
for j in range(999, i - 1, -1): # exclude implementation j * i
mult = i * j # multiplication
count += 1
if mult > max_num and palindrome(mult): # chek conditions
max_num = mult #remember largest
ii = i
jj = j
ccount = count
return "\npalindrome = {0}\ncount = {1}\ni = {2}\nj = {3}".format(max_num, ccount, ii, jj)
print ("time", timeit('largest()', 'from __main__ import largest', number = 1))
print(largest())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.