marmot 发表于 2017-2-20 21:46:32

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

# 反向取乘积,换成字符串,反向分片,若相等得解,加入列表,取max

list_huiwen = []#回文数列表
for x in range(999,100,-1):
    for y in range(999, 100, -1):
      num = str(x * y)
      num_1 = num[::-1]
      if num == num_1:   #判定字符串相等
            list_huiwen.append(int(num))

print("答案是: " + str(max(list_huiwen)))

余欲渔 发表于 2017-3-1 16:23:34

for i in range(999,100,-1):
    for j in range(999,i,-1):
      x=str(i*j)
      if x[:]==x[::-1]:
            print(i,j,i*j)
            exit()


== RESTART: C:\Users\ASUS\AppData\Local\Programs\Python\Python35-32\test.py ==
924 962 888888
>>>

夜魔时生 发表于 2017-3-6 13:36:34

a=1
b=0
c=0
l=[]
for i in range(100,1000):
    for j in range(100,1000):
      a=i*j
      b=list(str(a))
      c=list(reversed(b))
      if b==c:
            l.append(a)
print(max(l))      

testabc123 发表于 2017-3-9 16:48:10

#!/usr/bin/env python
#coding:utf-8

def Ss(m=100,n=100):
    lis=[]
    for a in list(range(10,m)):
      for b in list(range(10,n)):
            num=a*b
            if str(num)[::]==str(num)[::-1]:
                lis.append(num)
    return max(lis)



if __name__ == '__main__':
    smax=Ss(1000,1000)
    print(smax)

99592938 发表于 2017-3-14 14:40:06

l=[]
for i in range(100,1000):
    for j in range(i,1000):
      s=str(i*j)
      if s==s[::-1]:
            l.append(i*j)
print(max(l))

99592938 发表于 2017-3-14 14:41:58

Liu_xy 发表于 2016-5-4 22:43


第三行   for j in range(100, 1000):
可以改成   for j in range(i,1000):

546397641 发表于 2017-3-21 17:03:07

list1=[]
for i in range(100,1000):
    for j in range(100, 1000):
      a = i*j
      b=str(a)
      c=b[::-1]
      if a == int(c):
            list1.append(a)
print(max(list1))

结果是:906609

JonTargaryen 发表于 2017-3-27 09:04:39

本帖最后由 JonTargaryen 于 2017-3-27 10:04 编辑

#include <stdio.h>

int palindrome_judge(long int);
int product_judge(long int);

int main(void)
{
    long int result = 999 * 999;
    int flag;

    while(result > 10000)
    {
      result--;
      flag = palindrome_judge(result);

      if(flag)
      {
            if(product_judge(result))
            {
                break;
            }
      }
    }

    printf("%ld\n", result);

    return 0;
}

int palindrome_judge(long int result)
{
    char a;

    for(int i = 0; i < 6; i++)
    {
      a = result % 10;
      result /= 10;
    }

    if(a==a && a==a && a==a)
    {
      return 1;
    }
    {
      return 0;
    }
}

int product_judge(long int result)
{
    int num1, num2;
    for(num1 = 999; num1 > 99; num1--)
    {
      if(!(result % num1))
      {
            num2 = result / num1;
            if(num2 > 100 && num2 < 999)
            {
                return 1;
            }
      }
    }

    return 0;
}

JonTargaryen 发表于 2017-3-27 10:25:40

JonTargaryen 发表于 2017-3-27 09:04


def palindrome_judge(result):
    a = []

    for each in range(6):
      a.append(result % 10)
      result //= 10

    if a==a and a==a and a==a:
      return 1
    else:
      return 0

def product_judge(result):
    for num1 in range(999, 0, -1):
      if not (result % num1):
            if 99 < result // num1 <= 999:
                return 1

    return 0

def main():
    result = 999 * 999

    while result > 10000:
      result -= 1
      flag = palindrome_judge(result)

      if flag:
            if product_judge(result):
                break

    print(result)

if __name__ == '__main__':
    main()

marmot 发表于 2017-3-29 23:54:39

marmot 发表于 2017-2-20 21:46


def is_palindrome(n):
    return str(n) == str(n)[::-1]
      
output = filter(is_palindrome, )
print(max(list(output)))
filter升级版

凌晨分子 发表于 2017-4-4 23:56:15

结果:580085
代码:
def ishuiwen(s)://判断是否是回文数
           return s == s[::-1]

[-1]   //循环计算所有三位数间的乘积,将其中的回文数放入列表中,然后取最后一个元素,即最大的

凌晨分子 发表于 2017-4-5 00:08:03

凌晨分子 发表于 2017-4-4 23:56
结果:580085
代码:

有的问题,最后一个元素并不一定是最大的,所以修改一下:
sorted()[-1]//加个排序

最后最大回文数计算的是906609

Eagle.Tong 发表于 2017-4-16 02:35:53

本帖最后由 Eagle.Tong 于 2017-4-16 11:40 编辑

#找到有两个三位数相乘得到的最大回文数

flag = 0
lis = []
for i in list(range(500,1000))[::-1]:
    for j in list(range(100,1000))[::-1]:
      s = str(i*j)
      inv_s = s[::-1]
      if s == inv_s:
            lis.append(int(s))
            break

maxn = max(lis)
print('The largest palindrome product is %s'%(maxn))


结果:906609

天之南 发表于 2017-4-30 20:46:13

#include<stdio.h>
#include<math.h>


int main()
{
        int i = 999 * 999 / 1000 - 1;//求前三位的最大值
        int a = 0;//因数a
        int b = 0;//因数b
        int max = 0;
        for (i; i > 0; i--)
        {
                max = i * 1000 + back_num(i);
                for (a = (int)sqrt(max); max / a < 1000; a--)
                {
                        if (max % a == 0)
                        {
                                b = max / a;
                                i = 0;
                                break;
                        }
                }
        }

        printf("%d*%d=%d\n",a,b,max);

        return 0;
}

int back_num(int x)//求后三位
{
        int y = 0;
        int i = 100;
        while (x > 0) {
                y = y + x % 10 * i;
                x /= 10;
                i /= 10;
        }
        return y;
}

铭记太阳 发表于 2017-5-4 14:36:38

答案是 993 x 913 = 906609
思路:主要研究如何节省计算时间,数值大于900000,即其中任意一个数不能小于900000/999=900,i从999到900,j从i递减,同时只要i x j<900000,跳出循环因为再小的j都没意义了,如此程序最大可能节省时间。

#include<stdio.h>

int main(void)
{
        int i,j,Num,a=0,b=0,Rst=0;
        for(i=999;i>=900;--i)
        {
                for(j=i;j>=900;--j)
                {
                        Num=i*j;
                        if(Num<900000)        break;       
                        //剔除过小的数字节省计算量
                        if(Num-Num/10*10==9)
                                if((Num-Num/100*100)/10==(Num/10000-Num/100000*10))
                                        if((Num-Num/1000*1000)/100==(Num/1000-Num/10000*10))
                                                if(Num>Rst)
                                                {
                                                        a=i;        b=j;        Rst=Num;
                                                }
                }
        }       
        printf("%d x %d = %d\n",a,b,Rst);
        return 0;
}

进击的小蜗牛 发表于 2017-5-18 10:57:58

本帖最后由 进击的小蜗牛 于 2017-5-18 11:01 编辑

# 用的python 3.6
num = 0
for i in range(100,1000):
    for j in range(100,1000):
      fi = i * j
      to = int(str(fi)[::-1])
      if fi == to and fi > num:
            num = fi
            u,p = i,j
print(num)
print(u,p)
运行结果,回文数906609
两个三位数913,993

格式化、 发表于 2017-6-7 15:25:35

public static void main(String[] args) {
                // 4、一个回文数指的是从左向右读都一样的数字。最大的由
                // 两个两位数乘积构成的回文数是9009=91*99。 找出最大的有由三位数乘积构成的回文数。
                int i, j = 0, a = 0, b = 0, sum = 0;
                for (i = 999; i > 100; i--) {
                        for (j = 999; j > 100; j--) {
                                if (cmp(i * j)) {
                                        break;
                                }
                        }
                        if (sum < i * j) {
                                sum = i * j;
                                a = i;
                                b = j;
                        }
                }
                System.out.println(sum);
                System.out.println(a);
                System.out.println(b);
        }
        public static boolean cmp(int num) {
                String str = num + "";
                int ge = num % 10;
                int shi = num % 100 / 10;
                int bai = num % 1000 / 100;
                String zz = "" + bai + shi + ge;
                StringBuffer sss = new StringBuffer(zz);
                String yy = sss.reverse().toString();
                if (str.equals(yy + zz)) {
                        return true;
                }
                return false;
        }

运维小书童 发表于 2017-8-4 14:43:05

#求最大的 由2个3位数相乘的结果为回文的乘积
import time
list = []
start = time.clock()


def isreversed(arg):
    '转换成字符串判断是否回文'
    if str(arg)[::-1] == str(arg):
      return True
    return False


#对于100-999的三位数x,优先判断x*999是否回文,否则乘数-1
#得到第一个回文则跳出循环 x+1 开始下一轮循环 结果添加到列表
#最后输出列表的最大值
for x in range(100,1000):
    y = 999   
    while y > 100:
      result = x * y
      if isreversed(result):
            list.append(result)
            break
      y -= 1

print(max(list))
end = time.clock()
print('耗时%f s'%(end - start))

麦特的灰 发表于 2017-9-2 08:59:52

max=0
maxi=0
maxj=0
for i in range(100,999):
    for j in range(100,999):
      num =i *j
      a=num%10
      b=num//10%10
      c=num//100%10
      d=num//1000%10
      e=num//10000%10
      f=num//100000%10
      if (f==0):
            if(a==e and b==d):
                if (num>max):
                  max=num
                  maxi=i
                  maxj=j
      else:
            if(a==f and b==e and c==d):
                if (num>max):
                  max=num
                  maxi=i
                  maxj=j

print("%d*%d=%d"%(maxi,maxj,max))

BngThea 发表于 2017-9-11 14:22:49

def check(num):
    if num // 10**5 != (num % 10):
      return False
    elif num // 10**4 % 10 != num // 10 % 10:
      return False
    elif num // 10**3 % 10 != num // 100 % 10:
      return False
    else:
      return True


flage = False
list0 = []
for i in range(999,100,-1):
    for j in range(999,100,-1):
      if check(i * j):
         flage = True
         break
    if flage:
      list0.extend()
      
idx = list0.index(max(list0))
print('{0} = {1} * {2}'.format(list0,list0,list0))
页: 1 2 [3] 4 5 6 7
查看完整版本: 题目4:找出由两个三位数乘积构成的回文