鱼C论坛

 找回密码
 立即注册
楼主: 欧拉计划

题目4:找出由两个三位数乘积构成的回文

  [复制链接]
发表于 2017-2-20 21:46:32 | 显示全部楼层
  1. print("""一个回文数指的是从左向右和从右向左读都一样的数字。
  2. 最大的由两个两位数乘积构成的回文数是 9009 = 91 * 99。
  3. 找出最大的有由个三位数乘积构成的回文数。
  4. ---------------------------------------------------""")

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

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

  13. print("答案是: " + str(max(list_huiwen)))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-1 16:23:34 | 显示全部楼层
  1. for i in range(999,100,-1):
  2.     for j in range(999,i,-1):
  3.         x=str(i*j)
  4.         if x[:]==x[::-1]:
  5.             print(i,j,i*j)
  6.             exit()
复制代码


  1. == RESTART: C:\Users\ASUS\AppData\Local\Programs\Python\Python35-32\test.py ==
  2. 924 962 888888
  3. >>>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-6 13:36:34 | 显示全部楼层
  1. a=1
  2. b=0
  3. c=0
  4. l=[]
  5. for i in range(100,1000):
  6.     for j in range(100,1000):
  7.         a=i*j
  8.         b=list(str(a))
  9.         c=list(reversed(b))
  10.         if b==c:
  11.             l.append(a)
  12. print(max(l))      
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-14 14:40:06 | 显示全部楼层
  1. l=[]
  2. for i in range(100,1000):
  3.     for j in range(i,1000):
  4.         s=str(i*j)
  5.         if s==s[::-1]:
  6.             l.append(i*j)
  7. print(max(l))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-14 14:41:58 | 显示全部楼层

第三行     for j in range(100, 1000):
可以改成   for j in range(i,1000):
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-27 09:04:39 | 显示全部楼层
本帖最后由 JonTargaryen 于 2017-3-27 10:04 编辑
  1. #include <stdio.h>

  2. int palindrome_judge(long int);
  3. int product_judge(long int);

  4. int main(void)
  5. {
  6.     long int result = 999 * 999;
  7.     int flag;

  8.     while(result > 10000)
  9.     {
  10.         result--;
  11.         flag = palindrome_judge(result);

  12.         if(flag)
  13.         {
  14.             if(product_judge(result))
  15.             {
  16.                 break;
  17.             }
  18.         }
  19.     }

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

  21.     return 0;
  22. }

  23. int palindrome_judge(long int result)
  24. {
  25.     char a[10];

  26.     for(int i = 0; i < 6; i++)
  27.     {
  28.         a[i] = result % 10;
  29.         result /= 10;
  30.     }

  31.     if(a[0]==a[5] && a[1]==a[4] && a[2]==a[3])
  32.     {
  33.         return 1;
  34.     }
  35.     {
  36.         return 0;
  37.     }
  38. }

  39. int product_judge(long int result)
  40. {
  41.     int num1, num2;
  42.     for(num1 = 999; num1 > 99; num1--)
  43.     {
  44.         if(!(result % num1))
  45.         {
  46.             num2 = result / num1;
  47.             if(num2 > 100 && num2 < 999)
  48.             {
  49.                 return 1;
  50.             }
  51.         }
  52.     }

  53.     return 0;
  54. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-27 10:25:40 | 显示全部楼层
  1. def palindrome_judge(result):
  2.     a = []

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

  6.     if a[0]==a[5] and a[1]==a[4] and a[2]==a[3]:
  7.         return 1
  8.     else:
  9.         return 0

  10. def product_judge(result):
  11.     for num1 in range(999, 0, -1):
  12.         if not (result % num1):
  13.             if 99 < result // num1 <= 999:
  14.                 return 1

  15.     return 0

  16. def main():
  17.     result = 999 * 999

  18.     while result > 10000:
  19.         result -= 1
  20.         flag = palindrome_judge(result)

  21.         if flag:
  22.             if product_judge(result):
  23.                 break

  24.     print(result)

  25. if __name__ == '__main__':
  26.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 23:54:39 | 显示全部楼层
  1. def is_palindrome(n):
  2.     return str(n) == str(n)[::-1]
  3.       
  4. output = filter(is_palindrome, [x*y for x in range(100,1000) for y in range(100,1000)])
  5. print(max(list(output)))
复制代码

filter升级版
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-4 23:56:15 | 显示全部楼层
结果:580085
代码:
  1. def ishuiwen(s):  //判断是否是回文数
  2.            return s == s[::-1]

  3. [x*y for x in range(100, 999) for y in range(100, 999) if ishuiwen(str(x*y))][-1]   //循环计算所有三位数间的乘积,将其中的回文数放入列表中,然后取最后一个元素,即最大的
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-5 00:08:03 | 显示全部楼层
凌晨分子 发表于 2017-4-4 23:56
结果:580085
代码:

有的问题,最后一个元素并不一定是最大的,所以修改一下:
sorted([x*y for x in range(100, 999) for y in range(100, 999) if ishuiwen(str(x*y))])[-1]  //加个排序

最后最大回文数计算的是906609
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-16 02:35:53 | 显示全部楼层
本帖最后由 Eagle.Tong 于 2017-4-16 11:40 编辑

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

  1. flag = 0
  2. lis = []
  3. for i in list(range(500,1000))[::-1]:
  4.     for j in list(range(100,1000))[::-1]:
  5.         s = str(i*j)
  6.         inv_s = s[::-1]
  7.         if s == inv_s:
  8.             lis.append(int(s))
  9.             break

  10. maxn = max(lis)
  11. print('The largest palindrome product is %s'%(maxn))
复制代码



结果:906609
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-30 20:46:13 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<math.h>


  3. int main()
  4. {
  5.         int i = 999 * 999 / 1000 - 1;//求前三位的最大值
  6.         int a = 0;//因数a
  7.         int b = 0;//因数b
  8.         int max = 0;
  9.         for (i; i > 0; i--)
  10.         {
  11.                 max = i * 1000 + back_num(i);
  12.                 for (a = (int)sqrt(max); max / a < 1000; a--)
  13.                 {
  14.                         if (max % a == 0)
  15.                         {
  16.                                 b = max / a;
  17.                                 i = 0;
  18.                                 break;
  19.                         }
  20.                 }
  21.         }

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

  23.         return 0;
  24. }

  25. int back_num(int x)//求后三位
  26. {
  27.         int y = 0;
  28.         int i = 100;
  29.         while (x > 0) {
  30.                 y = y + x % 10 * i;
  31.                 x /= 10;
  32.                 i /= 10;
  33.         }
  34.         return y;
  35. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  1. #include<stdio.h>

  2. int main(void)
  3. {
  4.         int i,j,Num,a=0,b=0,Rst=0;
  5.         for(i=999;i>=900;--i)
  6.         {
  7.                 for(j=i;j>=900;--j)
  8.                 {
  9.                         Num=i*j;
  10.                         if(Num<900000)        break;       
  11.                         //剔除过小的数字节省计算量
  12.                         if(Num-Num/10*10==9)
  13.                                 if((Num-Num/100*100)/10==(Num/10000-Num/100000*10))
  14.                                         if((Num-Num/1000*1000)/100==(Num/1000-Num/10000*10))
  15.                                                 if(Num>Rst)
  16.                                                 {
  17.                                                         a=i;        b=j;        Rst=Num;
  18.                                                 }
  19.                 }
  20.         }       
  21.         printf("%d x %d = %d\n",a,b,Rst);
  22.         return 0;
  23. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-18 10:57:58 | 显示全部楼层
本帖最后由 进击的小蜗牛 于 2017-5-18 11:01 编辑
  1. # 用的python 3.6
  2. num = 0
  3. for i in range(100,1000):
  4.     for j in range(100,1000):
  5.         fi = i * j
  6.         to = int(str(fi)[::-1])
  7.         if fi == to and fi > num:
  8.             num = fi
  9.             u,p = i,j
  10. print(num)
  11. print(u,p)
复制代码

运行结果,回文数906609
两个三位数913,993
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-7 15:25:35 | 显示全部楼层
  1. public static void main(String[] args) {
  2.                 // 4、一个回文数指的是从左向右读都一样的数字。最大的由
  3.                 // 两个两位数乘积构成的回文数是9009=91*99。 找出最大的有由三位数乘积构成的回文数。
  4.                 int i, j = 0, a = 0, b = 0, sum = 0;
  5.                 for (i = 999; i > 100; i--) {
  6.                         for (j = 999; j > 100; j--) {
  7.                                 if (cmp(i * j)) {
  8.                                         break;
  9.                                 }
  10.                         }
  11.                         if (sum < i * j) {
  12.                                 sum = i * j;
  13.                                 a = i;
  14.                                 b = j;
  15.                         }
  16.                 }
  17.                 System.out.println(sum);
  18.                 System.out.println(a);
  19.                 System.out.println(b);
  20.         }
  21.         public static boolean cmp(int num) {
  22.                 String str = num + "";
  23.                 int ge = num % 10;
  24.                 int shi = num % 100 / 10;
  25.                 int bai = num % 1000 / 100;
  26.                 String zz = "" + bai + shi + ge;
  27.                 StringBuffer sss = new StringBuffer(zz);
  28.                 String yy = sss.reverse().toString();
  29.                 if (str.equals(yy + zz)) {
  30.                         return true;
  31.                 }
  32.                 return false;
  33.         }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-4 14:43:05 | 显示全部楼层
  1. #求最大的 由2个3位数相乘的结果为回文的乘积
  2. import time
  3. list = []
  4. start = time.clock()


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


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

  21. print(max(list))
  22. end = time.clock()
  23. print('耗时%f s'%(end - start))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-2 08:59:52 | 显示全部楼层
  1. max=0
  2. maxi=0
  3. maxj=0
  4. for i in range(100,999):
  5.     for j in range(100,999):
  6.         num =i *j
  7.         a=num%10
  8.         b=num//10%10
  9.         c=num//100%10
  10.         d=num//1000%10
  11.         e=num//10000%10
  12.         f=num//100000%10
  13.         if (f==0):
  14.             if(a==e and b==d):
  15.                 if (num>max):
  16.                     max=num
  17.                     maxi=i
  18.                     maxj=j
  19.         else:
  20.             if(a==f and b==e and c==d):
  21.                 if (num>max):
  22.                     max=num
  23.                     maxi=i
  24.                     maxj=j

  25. print("%d*%d=%d"%(maxi,maxj,max))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-11 14:22:49 | 显示全部楼层
  1. def check(num):
  2.     if num // 10**5 != (num % 10):
  3.         return False
  4.     elif num // 10**4 % 10 != num // 10 % 10:
  5.         return False
  6.     elif num // 10**3 % 10 != num // 100 % 10:
  7.         return False
  8.     else:
  9.         return True


  10. flage = False
  11. list0 = []
  12. for i in range(999,100,-1):
  13.     for j in range(999,100,-1):
  14.         if check(i * j):
  15.            flage = True
  16.            break
  17.     if flage:
  18.         list0.extend([i*j,i,j])
  19.         
  20. idx = list0.index(max(list0))
  21. print('{0} = {1} * {2}'.format(list0[idx],list0[idx+1],list0[idx+2]))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 09:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表