776667 发表于 2016-10-2 00:00:31

本帖最后由 776667 于 2016-10-2 00:03 编辑

def euler(x,y):
    return max(])

if __name__ == '__main__':
    print(euler(100,1000))

镜中人31 发表于 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

镜中人31 发表于 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

jerryxjr1220 发表于 2016-10-10 10:05:35

906609


一行代码:
print max(])

梦想绘制者 发表于 2016-11-2 21:04:26

# Python 3.5实现最大的由两个三位数乘积构成的回文数
#
# 未来尽可能的提高效率,避免前后两数重复相乘的情况
# 例如:123 * 456 与 456 * 123
# 设置限制条件使得输出结果均为第一个数小于第二个数
# 当不满足条件时使用continue语句快速跳过
#
def maxPalindromeProduct(digitNum):
    result = []
    first = []
    second = []
    limit0 = 10 ** (digitNum - 1)
    limit1 = 10 ** digitNum
   
    for i in range(limit0 + 1,limit1):
      for j in range(limit0 + 1,limit1):
            if i > j:
                continue
            else:
                product = i * j
                if isPalindrome(product):
                  result.append(product)
                  first.append(i)
                  second.append(j)

    maxResult = max(result)
    lenResult = len(result)
    for k in range(lenResult):
      if result == maxResult:
            max_index = k
            break
   
    return maxResult,first,second

def isPalindrome(n):
    strN = str(n)
    lenN = len(strN)
    half = lenN //2

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


print('最大的由两个三位数乘积构成的回文数为:',end = '')
maxPP = maxPalindromeProduct(3)
print('%d = %d×%d'%(maxPP,maxPP,maxPP))

>>>
最大的由两个三位数乘积构成的回文数为:906609 = 913×993

梦想绘制者 发表于 2016-11-2 21:10:41

jerryxjr1220 发表于 2016-10-10 10:05


很简洁,但是没有取得两个因数的值。{:9_237:}

jerryxjr1220 发表于 2016-11-2 23:11:23

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

题目只是要乘积啊,并没有要显示2个乘数

tsembrace 发表于 2016-11-7 21:37:39

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

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

list=[]
for i in range(100,1000):
    for j in range(i,1000):
      s=i*j
      if isPalindrome(s):
            list.append(s)
print(list)
list.sort()
print(list[-1])
end=time.clock()
print("总耗时:"+str(end-start)+"seconds")
            




      

lyciam 发表于 2016-11-16 18:36:36

def euler04(figures=3):
    """
    一个回文数指的是从左向右和从右向左读都一样的数字。最大的由两个两位数乘积构成的回文数是9009=91*99.
    找出最大的有由三个数乘积构成的回文数。
    """
    snum = int('1' + '0' * (figures-1) )
    enum = int('9' * figures)
   
    result = {}
    items = range(snum, enum+1)
    count = 0
    for n in items:
      for m in items[ count: ]:
            if list(str(n*m)) == list ( reversed ( str(n*m) ) ):
                result.update( {m*n : [ m , n ] } )
      count += 1
    return result

numdict = euler04(3)
key = max( numdict.keys() )
print('{}:{} * {}'.format(key,numdict,numdict))


figures = 3 运行结果:906609:993 * 913
figures = 4 运行结果:99000099:9999 * 9901 (四位数效率就开始慢啦……)

〃陌殇、怀素 发表于 2016-11-20 21:28:14

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int i,j;                  //三位数乘数
    int m,n,t;
    int max=0;

    for(i=100;i<1000;i++)
    {
      for(j=100;j<1000;j++)
      {
            m =0;
            n=i*j;
            t = n;
            while(t!=0)         //倒转一个数
            {
                m=m*10+t%10;
                t=t/10;
                if(n == m)          //判断是否回文数
                {
                  if(n > max)
                        max = m;
                }
            }
      }

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

}

joker11111 发表于 2016-11-20 22:13:24

本帖最后由 joker11111 于 2016-11-21 13:23 编辑

//-------------------------------------------
//04--找出最大的由3位数构成的回文数
//一个回文数是指从左读或者从右读都是一样的数
//如9009 = 91 * 99为最大的由两位数乘积构成的回文数
//-------------------------------------------
#include <windows.h>
#include <iostream>
#include <time.h>
#include <math.h>

using namespace std;

long int PalNum(int& m);
bool JuPalNum(long int& m);
int main()
{
        clock_t start, finish;
        double totaltime;
        start = clock();

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

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

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

        for (p = pow(10, m - 1); p < pow(10, m); p++)
        {
                for (q = pow(10, m - 1); q < pow(10, m); q++)
                {
                        s = p * q;
                        if (JuPalNum(s) && s > max_s)
                        {
                                        max_s = s;
                                        p1 = p;
                                        q1 = q;
                        }
                }
        }
        cout << p1 << "*" << q1 << "=" << max_s << endl;
        return max_s;
}

/**********************************
功能:判断这个数是否为回文数
***********************************/
bool JuPalNum(long int& m)
{
        int l = 0;                //l为传入m的位数
        long int n = 0, p = m, q;
        while (p)
        {
                p /= 10;
                l++;
        }
        p = m;
        while (l)
        {
                q = p%10;
                p /= 10;
                n += q * pow(10,l-1);
                l--;
        }
        if (n == m)
                return true;
        else
                return false;
}

913*993 = 906609

style丶焚寂 发表于 2016-11-24 20:00:45

def huiwen():
        res = []
        res1=[]
        for i in range(100,1000):
                for j in range(100,1000):
                        k=i*j
                        listk=list(str(k))
                        relistk=listk[:]
                        relistk.reverse()
                        if listk==relistk:
                                res.append(k)
                                res1.append((i,j))

        return res,res1

a,b=huiwen()
max_huiwen = max(a)
max_a,max_b=b




最大为906609,913*993
但是运行比较慢,没有优化,就是最简单的方法,平方级的复杂度

芒果加黄桃 发表于 2017-1-6 22:34:47

def isPalindromic(n):
    t1 = list(str(n))
    t2 = t1.copy()
    t2.reverse()
    if t1 == t2:
      return True
    else:
      return False

start = time()
for number in range(999999,10001,-1):
    if isPalindromic(number):
      for m in range(999,100,-1):
            if number // m > m:
                break
            if number % m == 0:
                n = number / m
                if n >= 100:
                  print('回文数 %d 由三位数:%d 和三位数 %d 相乘获得' % (number ,m ,n ))
                  break
print('cost %.3f sec' % (time()-start))

marmot 发表于 2017-1-10 16:47:59

import time
start=time.time()
i=1
for x in range(1000,101,-1):            #反着跳 效率高
    for y in range(1000,101,-1):
      num= x*y
      list1=str(num)
      if list1[:] == list1[::-1]:
            if num > i :            #取出最大数和构成它的因数
                i = num
                m= x
                n=y
            print(i,m,n)
print('用时%.5f' %(time.time()-start))

————————————————————————————————————
结果
906609 993 913
用时0.53135

marmot 发表于 2017-1-10 16:49:15

import time
start=time.time()
i=1
for x in range(100,1000):            #反着跳 效率高
    for y in range(100,1000):
      num= x*y
      list1=str(num)
      if list1[:] == list1[::-1]:
            if num > i :            #取出最大数和构成它的因数
                i = num
                m= x
                n=y
            print(i,m,n)
print('用时%.5f' %(time.time()-start))


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

为什么正着跳效率还高点0.0

渡风 发表于 2017-1-12 20:52:44

本帖最后由 渡风 于 2017-1-12 20:58 编辑

此代码使用matlab编程
Problem4所用时间为3.1214秒
Problem4的答案为906609
% 题目4:找出由两个三位数乘积构成的回文
function Output=Problem4(Input)
if nargin==0
Input=999;
Sum=Input*2;
end
tic
Flag=0;
for kk=Sum:-1:100+100
    for ii=999:-1:100
      for jj=999:-1:100
            if ii+jj==kk&&ii<=jj
                Str=num2str(ii*jj);
                Other=Str(end:-1:1);
                if Str==Other
                  Output=ii*jj;
                  Flag=1;%用来跳出多重循环
                  break
                end
            end
      end
      if Flag==1
            break
      end
    end
      if Flag==1
            break
      end
end   
toc
disp('此代码使用matlab编程')
disp(['Problem4所用时间为',num2str(toc)])
disp(['Problem4的答案为',num2str(Output)])
end

shinningpika 发表于 2017-1-23 18:17:10

a=[]
def check(d):
    d=str(d)
    e=d[::-1]
    e=int(e)
    d=int(d)
    if (e+d)==d*2:
      a.append(d)
for i in range(100,999):
    for each in range(150,200):
      d=i*each
      check(d)
print(a[:-1])

研究半天。。尴尬

FlySelf 发表于 2017-2-2 11:07:56

import time

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

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

    length = len(list_number)
    for n in range(0, length // 2):
      if list_number != list_number:
            flag = False
    return flag

start = time.clock()
max_palindromic = 0
for i in range(100, 1000):
    for j in range(100, 1000):
      if is_palindromic(i * j):
            if max_palindromic < (i * j):
                max_palindromic = i * j
            print('%d x %d = %d' %(i, j, i * j))
            break
print('最大的由两个三位数乘积构成的回文数为%d' %max_palindromic)
end = time.clock()
print('程序执行了%fs。' %(end - start))

执行结果:
993 X 913 = 906609
最大的由两个三位数乘积构成的回文数为906609
程序执行了1.310824s。

0mrli0 发表于 2017-2-20 18:33:46

本帖最后由 0mrli0 于 2017-2-20 18:34 编辑

/*找出最大的由两个三位数乘积构成的回文
分析:先判断一个六位数是否是回文,是然后判断能否找到两个三位数因子*/

#include <stdio.h>

int IsPalindrome(int n)//判断是不是回文
{
    int i = 6;
    int a = {0};
    while(i)
    {
      i--;
      a = n % 10;
      n = n / 10;
    }
    return (a==a && a==a && a==a) ? 1 : 0;
}

int Isfactoring(int n)//判断能否分解为两个三位数相乘
{
    int i = 1000, test;
    int flag = 0;
    while(i > 100)
    {
      i--;
      if(n%i == 0)
      {
            test = n / i;
            if(test>=100 && test<1000)
            {
                flag = 1;
                break;
            }
      }
    }
    return flag;
}
int main()
{
    int i = 1000000, max = 0;
    while(i>100000)
    {
      i--;
      //max = (IsPalindrome(i) && Isfactoring(i)) ? i : max;
      if(IsPalindrome(i))
      {
            if(Isfactoring(i))
            {
                max = i;
                break;
            }
      }
    }
    printf("max palindrome = %d\n", max);
    return 0;
}


max palindrome = 906609

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

没有输出因子。。。

0mrli0 发表于 2017-2-20 20:16:51

/*题目:2520是最小的能被1-10中的每个数字整除的正整数。
       最小的能被1-20中的每个整数整除的正整数是多少。
分析:1.简单粗暴的是直接一个一个找。
       3.原来可以两个两个求公倍数*/
#include <stdio.h>
#include <stdlib.h>

int gcd(int a, int b)
{
        int t;
        if(b == 0)
        {
                t = a;
        }
        else
    {
      t = gcd(b, a % b);
    }
        return t;
}
/*最小公倍数*/
int lcm(int a, int b)
{
        int t;
        t = a * b /gcd(a, b);
        return t;
}
int main()
{
    int i, t = 1;
    for(i=2; i<=19; i++)
    {
      t = lcm(t, i);
    }
    printf("t = %d",t);
    return 0;
}
t = 232792560
Process returned 0 (0x0)   execution time : 0.014 s
页: 1 [2] 3 4 5 6 7
查看完整版本: 题目4:找出由两个三位数乘积构成的回文