鱼C论坛

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

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

  [复制链接]
发表于 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)))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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))       
想知道小甲鱼最近在做啥?请访问 -> 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

第三行     for j in range(100, 1000):
可以改成   for j in range(i,1000):
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[10];

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

    if(a[0]==a[5] && a[1]==a[4] && a[2]==a[3])
    {
        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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

    if a[0]==a[5] and a[1]==a[4] and a[2]==a[3]:
        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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 23:54:39 | 显示全部楼层
def is_palindrome(n):
    return str(n) == str(n)[::-1]
       
output = filter(is_palindrome, [x*y for x in range(100,1000) for y in range(100,1000)])
print(max(list(output)))
filter升级版
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

[x*y for x in range(100, 999) for y in range(100, 999) if ishuiwen(str(x*y))][-1]   //循环计算所有三位数间的乘积,将其中的回文数放入列表中,然后取最后一个元素,即最大的
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> 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都没意义了,如此程序最大可能节省时间。
#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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([i*j,i,j])
        
idx = list0.index(max(list0))
print('{0} = {1} * {2}'.format(list0[idx],list0[idx+1],list0[idx+2]))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-29 03:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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