鱼C论坛

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

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

  [复制链接]
发表于 2016-10-2 00:00:31 | 显示全部楼层
本帖最后由 776667 于 2016-10-2 00:03 编辑
  1. def euler(x,y):
  2.     return max([i*j for i in range(x,y) for j in range(x,y) if str(i*j) == str(i*j)[::-1]])

  3. if __name__ == '__main__':
  4.     print(euler(100,1000))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-6 20:25:04 | 显示全部楼层
final = 0
for i in range(100,1000):
    for j in range(100,1000):
        num = i * j
        num2 = num
        s = str()
        while True:
            s = s + str(num2%10)
            num2 = num2//10
            if num2 == 0:
                break
        if int(s) == num:
            if num > final:
                final = num
                x = i
                y = j
print(x,y,final)

答案:913*993 = 906609
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-6 20:28:03 | 显示全部楼层
镜中人31 发表于 2016-10-6 20:25
final = 0
for i in range(100,1000):
    for j in range(100,1000):

我判断回文的方法是:
将乘积的最后一位数字以字符串的形式从后往前相加,然后再判断其整型和原乘积是否相等来确定是否为回文数,我使用的是python
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-10 10:05:35 | 显示全部楼层
  1. 906609
  2. [Finished in 0.6s]

  3. 一行代码:
  4. print max([i*j for i in range(100,1000) for j in range(100,1000) if str(i*j) == str(i*j)[::-1]])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-2 21:04:26 | 显示全部楼层
  1. # Python 3.5实现最大的由两个三位数乘积构成的回文数
  2. #
  3. # 未来尽可能的提高效率,避免前后两数重复相乘的情况
  4. # 例如:123 * 456 与 456 * 123
  5. # 设置限制条件使得输出结果均为第一个数小于第二个数
  6. # 当不满足条件时使用continue语句快速跳过
  7. #
  8. def maxPalindromeProduct(digitNum):
  9.     result = []
  10.     first = []
  11.     second = []
  12.     limit0 = 10 ** (digitNum - 1)
  13.     limit1 = 10 ** digitNum
  14.    
  15.     for i in range(limit0 + 1,limit1):
  16.         for j in range(limit0 + 1,limit1):
  17.             if i > j:
  18.                 continue
  19.             else:
  20.                 product = i * j
  21.                 if isPalindrome(product):
  22.                     result.append(product)
  23.                     first.append(i)
  24.                     second.append(j)

  25.     maxResult = max(result)
  26.     lenResult = len(result)
  27.     for k in range(lenResult):
  28.         if result[k] == maxResult:
  29.             max_index = k
  30.             break
  31.    
  32.     return maxResult,first[max_index],second[max_index]

  33. def isPalindrome(n):
  34.     strN = str(n)
  35.     lenN = len(strN)
  36.     half = lenN //2

  37.     for i in range(half):
  38.         if strN[i] != strN[-i - 1]: # 等同于strN[i] != strN.pop():
  39.             return False
  40.     return True


  41. print('最大的由两个三位数乘积构成的回文数为:',end = '')
  42. maxPP = maxPalindromeProduct(3)
  43. print('%d = %d×%d'%(maxPP[0],maxPP[1],maxPP[2]))
复制代码

>>>
最大的由两个三位数乘积构成的回文数为:906609 = 913×993
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-2 21:10:41 | 显示全部楼层

很简洁,但是没有取得两个因数的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-2 23:11:23 | 显示全部楼层
梦想绘制者 发表于 2016-11-2 21:10
很简洁,但是没有取得两个因数的值。

题目只是要乘积啊,并没有要显示2个乘数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-7 21:37:39 | 显示全部楼层
  1. """
  2. 一个回文数是指从左向右和从右向左都一样的数字。
  3. 最大的由两个两位数乘积构成的回文数9009=91*99;
  4. 找出最大的由两个三位数乘积构成的回文数。
  5. """
  6. import copy
  7. import time

  8. start=time.clock()
  9. #先定义一个判断回文数的函数
  10. def isPalindrome(n):
  11.     m=n
  12.     list=[]
  13.     #把n的各位倒序插入列表
  14.     while m!=0:
  15.         list.append(m%10)
  16.         m=int(m/10)
  17.     #下一句不能简单的用listx=list代替
  18.     #这样无法真正生成一个新列表赋给listx,而是把list的引用赋给了listx
  19.     #如果修改list或者修改listx,其实都是修改的引用指向的内容
  20.     #会同时影响listx和list
  21.     listx=copy.deepcopy(list)
  22.     list.reverse()
  23.     if list==listx:
  24.         return True
  25.     else:
  26.         return False

  27. list=[]
  28. for i in range(100,1000):
  29.     for j in range(i,1000):
  30.         s=i*j
  31.         if isPalindrome(s):
  32.             list.append(s)
  33. print(list)
  34. list.sort()
  35. print(list[-1])
  36. end=time.clock()
  37. print("总耗时:"+str(end-start)+"seconds")
  38.             




  39.         
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-16 18:36:36 | 显示全部楼层
  1. def euler04(figures=3):
  2.     """
  3.     一个回文数指的是从左向右和从右向左读都一样的数字。最大的由两个两位数乘积构成的回文数是9009=91*99.
  4.     找出最大的有由三个数乘积构成的回文数。
  5.     """
  6.     snum = int('1' + '0' * (figures-1) )
  7.     enum = int('9' * figures)
  8.    
  9.     result = {}
  10.     items = range(snum, enum+1)
  11.     count = 0
  12.     for n in items:
  13.         for m in items[ count: ]:
  14.             if list(str(n*m)) == list ( reversed ( str(n*m) ) ):
  15.                 result.update( {m*n : [ m , n ] } )
  16.         count += 1
  17.     return result

  18. numdict = euler04(3)
  19. key = max( numdict.keys() )
  20. print('{}:  {} * {}'.format(key,numdict[key][0],numdict[key][1]))
复制代码



figures = 3 运行结果:906609:  993 * 913
figures = 4 运行结果:99000099:  9999 * 9901 (四位数效率就开始慢啦……)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-20 21:28:14 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. int main()
  4. {
  5.     int i,j;                    //三位数乘数
  6.     int m,n,t;
  7.     int max=0;

  8.     for(i=100;i<1000;i++)
  9.     {
  10.         for(j=100;j<1000;j++)
  11.         {
  12.             m =0;
  13.             n=i*j;
  14.             t = n;
  15.             while(t!=0)         //倒转一个数
  16.             {
  17.                 m=m*10+t%10;
  18.                 t=t/10;
  19.                 if(n == m)          //判断是否回文数
  20.                 {
  21.                     if(n > max)
  22.                         max = m;
  23.                 }
  24.             }
  25.         }

  26.     }
  27.     printf("三位数乘积所得的最大回文数为: %d \n",max);
  28.     return 0;

  29. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-20 22:13:24 | 显示全部楼层
本帖最后由 joker11111 于 2016-11-21 13:23 编辑
  1. //-------------------------------------------
  2. //04--找出最大的由3位数构成的回文数
  3. //一个回文数是指从左读或者从右读都是一样的数
  4. //如9009 = 91 * 99  为最大的由两位数乘积构成的回文数
  5. //-------------------------------------------
  6. #include <windows.h>
  7. #include <iostream>
  8. #include <time.h>
  9. #include <math.h>

  10. using namespace std;

  11. long int PalNum(int& m);
  12. bool JuPalNum(long int& m);
  13. int main()
  14. {
  15.         clock_t start, finish;
  16.         double totaltime;
  17.         start = clock();

  18.         int m = 3;
  19.         cout << "最大的由" << m << "位数乘积构成的回文数为:" << PalNum(m) << endl;

  20.         finish = clock();
  21.         totaltime = (double)(finish - start) / CLOCKS_PER_SEC;
  22.         cout << "此程序的运行时间为" << totaltime << endl;
  23.         system("pause");
  24.         return 0;
  25. }

  26. /**********************************
  27. 功能:返回最大的由m位数乘积构成的回文数
  28. ***********************************/
  29. long int PalNum(int& m)
  30. {
  31.         int p, q, p1, q1;
  32.         long int s,max_s = 0;

  33.         for (p = pow(10, m - 1); p < pow(10, m); p++)
  34.         {
  35.                 for (q = pow(10, m - 1); q < pow(10, m); q++)
  36.                 {
  37.                         s = p * q;
  38.                         if (JuPalNum(s) && s > max_s)
  39.                         {
  40.                                         max_s = s;
  41.                                         p1 = p;
  42.                                         q1 = q;
  43.                         }
  44.                 }
  45.         }
  46.         cout << p1 << "*" << q1 << "=" << max_s << endl;
  47.         return max_s;
  48. }

  49. /**********************************
  50. 功能:判断这个数是否为回文数
  51. ***********************************/
  52. bool JuPalNum(long int& m)
  53. {
  54.         int l = 0;                //l为传入m的位数
  55.         long int n = 0, p = m, q;
  56.         while (p)
  57.         {
  58.                 p /= 10;
  59.                 l++;
  60.         }
  61.         p = m;
  62.         while (l)
  63.         {
  64.                 q = p%10;
  65.                 p /= 10;
  66.                 n += q * pow(10,l-1);
  67.                 l--;
  68.         }
  69.         if (n == m)
  70.                 return true;
  71.         else
  72.                 return false;
  73. }
复制代码


913*993 = 906609
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-24 20:00:45 | 显示全部楼层
  1. def huiwen():
  2.         res = []
  3.         res1=[]
  4.         for i in range(100,1000):
  5.                 for j in range(100,1000):
  6.                         k=i*j
  7.                         listk=list(str(k))
  8.                         relistk=listk[:]
  9.                         relistk.reverse()
  10.                         if listk==relistk:
  11.                                 res.append(k)
  12.                                 res1.append((i,j))

  13.         return res,res1

  14. a,b=huiwen()
  15. max_huiwen = max(a)
  16. max_a,max_b=b[a.index(max_huiwen)]

复制代码



最大为906609,913*993
但是运行比较慢,没有优化,就是最简单的方法,平方级的复杂度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-6 22:34:47 | 显示全部楼层
  1. def isPalindromic(n):
  2.     t1 = list(str(n))
  3.     t2 = t1.copy()
  4.     t2.reverse()
  5.     if t1 == t2:
  6.         return True
  7.     else:
  8.         return False

  9. start = time()
  10. for number in range(999999,10001,-1):
  11.     if isPalindromic(number):
  12.         for m in range(999,100,-1):
  13.             if number // m > m:
  14.                 break
  15.             if number % m == 0:
  16.                 n = number / m
  17.                 if n >= 100:
  18.                     print('回文数 %d 由三位数:%d 和三位数 %d 相乘获得' % (number ,m ,n ))
  19.                     break
  20. print('cost %.3f sec' % (time()-start))  
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-10 16:47:59 | 显示全部楼层
  1. import time
  2. start=time.time()
  3. i=1
  4. for x in range(1000,101,-1):            #反着跳 效率高
  5.     for y in range(1000,101,-1):
  6.         num= x*y
  7.         list1=str(num)
  8.         if list1[:] == list1[::-1]:
  9.             if num > i :            #取出最大数和构成它的因数
  10.                 i = num
  11.                 m= x
  12.                 n=y
  13.             print(i,m,n)
  14. print('用时%.5f' %(time.time()-start))
复制代码


————————————————————————————————————
结果
906609 993 913
用时0.53135
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-10 16:49:15 | 显示全部楼层
  1. import time
  2. start=time.time()
  3. i=1
  4. for x in range(100,1000):            #反着跳 效率高
  5.     for y in range(100,1000):
  6.         num= x*y
  7.         list1=str(num)
  8.         if list1[:] == list1[::-1]:
  9.             if num > i :            #取出最大数和构成它的因数
  10.                 i = num
  11.                 m= x
  12.                 n=y
  13.             print(i,m,n)
  14. print('用时%.5f' %(time.time()-start))
复制代码



——————————————————————
906609 913 993
用时0.50133

为什么正着跳效率还高点0.0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-12 20:52:44 | 显示全部楼层
本帖最后由 渡风 于 2017-1-12 20:58 编辑

此代码使用matlab编程
Problem4所用时间为3.1214秒
Problem4的答案为906609
  1. % 题目4:找出由两个三位数乘积构成的回文
  2. function Output=Problem4(Input)
  3. if nargin==0
  4. Input=999;
  5. Sum=Input*2;
  6. end
  7. tic
  8. Flag=0;
  9. for kk=Sum:-1:100+100
  10.     for ii=999:-1:100
  11.         for jj=999:-1:100
  12.             if ii+jj==kk&&ii<=jj
  13.                 Str=num2str(ii*jj);
  14.                 Other=Str(end:-1:1);
  15.                 if Str==Other
  16.                     Output=ii*jj;
  17.                     Flag=1;%用来跳出多重循环
  18.                     break
  19.                 end
  20.             end
  21.         end
  22.         if Flag==1
  23.             break
  24.         end
  25.     end
  26.         if Flag==1
  27.             break
  28.         end
  29. end   
  30. toc
  31. disp('此代码使用matlab编程')
  32. disp(['Problem4所用时间为',num2str(toc)])
  33. disp(['Problem4的答案为',num2str(Output)])
  34. end
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-23 18:17:10 | 显示全部楼层
  1. a=[]
  2. def check(d):
  3.     d=str(d)
  4.     e=d[::-1]
  5.     e=int(e)
  6.     d=int(d)
  7.     if (e+d)==d*2:
  8.         a.append(d)
  9. for i in range(100,999):
  10.     for each in range(150,200):
  11.         d=i*each
  12.         check(d)
  13. print(a[:-1])
复制代码

研究半天。。尴尬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-2 11:07:56 | 显示全部楼层
  1. import time

  2. def is_palindromic(number=100):
  3.     '判断是否为回文数'
  4.     flag = True
  5.     list_number = []

  6.     while number != 0:
  7.         list_number.append(number % 10)
  8.         number //= 10

  9.     length = len(list_number)
  10.     for n in range(0, length // 2):
  11.         if list_number[n] != list_number[length - n - 1]:
  12.             flag = False
  13.     return flag

  14. start = time.clock()
  15. max_palindromic = 0
  16. for i in range(100, 1000):
  17.     for j in range(100, 1000):
  18.         if is_palindromic(i * j):
  19.             if max_palindromic < (i * j):
  20.                 max_palindromic = i * j
  21.             print('%d x %d = %d' %(i, j, i * j))
  22.             break
  23. print('最大的由两个三位数乘积构成的回文数为%d' %max_palindromic)
  24. end = time.clock()
  25. print('程序执行了%fs。' %(end - start))
复制代码

执行结果:
993 X 913 = 906609
最大的由两个三位数乘积构成的回文数为906609
程序执行了1.310824s。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-20 18:33:46 | 显示全部楼层
本帖最后由 0mrli0 于 2017-2-20 18:34 编辑
  1. /*找出最大的由两个三位数乘积构成的回文
  2. 分析:先判断一个六位数是否是回文,是然后判断能否找到两个三位数因子*/

  3. #include <stdio.h>

  4. int IsPalindrome(int n)  //判断是不是回文
  5. {
  6.     int i = 6;
  7.     int a[6] = {0};
  8.     while(i)
  9.     {
  10.         i--;
  11.         a[i] = n % 10;
  12.         n = n / 10;
  13.     }
  14.     return (a[0]==a[5] && a[1]==a[4] && a[2]==a[3]) ? 1 : 0;
  15. }

  16. int Isfactoring(int n)  //判断能否分解为两个三位数相乘
  17. {
  18.     int i = 1000, test;
  19.     int flag = 0;
  20.     while(i > 100)
  21.     {
  22.         i--;
  23.         if(n%i == 0)
  24.         {
  25.             test = n / i;
  26.             if(test>=100 && test<1000)
  27.             {
  28.                 flag = 1;
  29.                 break;
  30.             }
  31.         }
  32.     }
  33.     return flag;
  34. }
  35. int main()
  36. {
  37.     int i = 1000000, max = 0;
  38.     while(i>100000)
  39.     {
  40.         i--;
  41.         //max = (IsPalindrome(i) && Isfactoring(i)) ? i : max;
  42.         if(IsPalindrome(i))
  43.         {
  44.             if(Isfactoring(i))
  45.             {
  46.                 max = i;
  47.                 break;
  48.             }
  49.         }
  50.     }
  51.     printf("max palindrome = %d\n", max);
  52.     return 0;
  53. }
复制代码


max palindrome = 906609

Process returned 0 (0x0)   execution time : 0.018 s

没有输出因子。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-20 20:16:51 | 显示全部楼层
  1. /*题目:2520是最小的能被1-10中的每个数字整除的正整数。
  2.        最小的能被1-20中的每个整数整除的正整数是多少。
  3.   分析:1.简单粗暴的是直接一个一个找。
  4.        3.原来可以两个两个求公倍数*/
  5. #include <stdio.h>
  6. #include <stdlib.h>

  7. int gcd(int a, int b)
  8. {
  9.         int t;
  10.         if(b == 0)
  11.         {
  12.                 t = a;
  13.         }
  14.         else
  15.     {
  16.         t = gcd(b, a % b);
  17.     }
  18.         return t;
  19. }
  20. /*最小公倍数*/
  21. int lcm(int a, int b)
  22. {
  23.         int t;
  24.         t = a * b /gcd(a, b);
  25.         return t;
  26. }
  27. int main()
  28. {
  29.     int i, t = 1;
  30.     for(i=2; i<=19; i++)
  31.     {
  32.         t = lcm(t, i);
  33.     }
  34.     printf("t = %d",t);
  35.     return 0;
  36. }
复制代码

t = 232792560
Process returned 0 (0x0)   execution time : 0.014 s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 18:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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