jerryxjr1220 发表于 2017-9-29 16:52:52

AArdio编译:
import console;
import time.timer

console.setTitle("test");

time.timer.start();

var is_reversed = function(n){
        s_n = tostring(n);
        r_n = string.reverse(s_n);
        return s_n == r_n
}

var max_n = 0
for(j=999;100;-1){
        for(i=999;100;-1){
                if is_reversed(i*j){
                        if(i*j>max_n){
                                max_n = i*j;
                                break;
                        };
                }
                if i*j<max_n{
                        break;
                }
        }
}

console.print(max_n);
console.print(time.timer.endTick());
console.pause();
console.close()
906609
26.249376773834 (毫秒)
请按任意键继续 ...

编程新血 发表于 2017-11-2 19:45:11

本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:03 编辑

python3:

n=999
while n>100:
    a=str(n*n)
    b=str(n*n-n)
    if a==a[::-1]:
      print('回文数为',a,'由',n,'和',n,'组成')
      break
    if b==b[::-1]:
      print('回文数为',b,'由',n,'和',n-1,'组成')
      break
    n-=1

'回文数为 698896 由 836 和 836 组成'
如果考虑不同数字的话,只用考虑变量b.

zjhnz 发表于 2018-1-4 13:27:35

本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:04 编辑

答案 993*913=906609 时间 0.2983 秒
#include <stdio.h>

int ispalindromic(int n)
{
        int xn=0,xn1;
        int temp=n;
        while (n/10)
        {
                xn1=n%10;
                xn=xn*10+xn1;
                n=n/10;
        }
        xn=xn*10+n;
        if (temp==xn)
        {
                return 1;
               
        }
        else
        {
                return 0;
        }
}

int isthree(int n)
{
        for (int i=999; i>=100; i--)
        {
                if(n%i==0 && n/i>100 && n/i<999 )
               
                {
                        printf("%d * %d =",i,n/i);
                        return 1;
                }
        }
       
        return 0;
}

int main(void)
{


                for(int i=998001; i>100000; i--)
                {
                        if( ispalindromic(i) && isthree(i))
                        {
                                printf("%d",i);
                                break;
                        }
                }
       
}

artistlu 发表于 2018-2-8 18:00:42

#include <stdio.h>

int isPalindrome(int);

int isPalindrome(int num)
{
    int revNum = 0;
    int tmp = num;
    while(tmp != 0)
    {
      revNum = revNum * 10 + tmp % 10;
      tmp /= 10;
    }

    return num == revNum;
}

int main(void)
{   
    int multi, result, a, b;
    for (int i = 100; i <= 999; i++)
    {
      for (int j = i + 1; j <= 999; j++)
      {
            multi = i * j;
            if (isPalindrome(multi) && result < multi)
            {
                result = multi;
                a = i;
                b = j;
            }
      }
    }
    printf("%d * %d = %d\n", a, b, result);
    return 0;
}

//913 * 993 = 906609

由我们主宰 发表于 2018-3-4 17:00:45

#include<stdio.h>
int CheckPalindrome(int m)
{
        int n=0,quotient=m,remainder;
        while(0!=quotient)
        {
                remainder=quotient%10;
                n=10*n+remainder;
                quotient=quotient/10;                               
        }
        if(n==m)
        {
                return 1;
        }
        else
        {
                return 0;
        }
}
int main()
{
        int m,p,q;
        for(p=999;p>100;p--)
        {
                for(q=999;q>100;q--)
                {
                        m=p*q;
                        if(CheckPalindrome(m))
                        {
                                printf("%d=%d*%d\n",m,p,q);
                                goto END;
                        }
                }
        }
END:
        return 0;
}

由我们主宰 发表于 2018-3-4 18:18:24

之前的代码没考虑好最大值,这里进行修改用MAX将最大的记录下来
#include<stdio.h>
struct MAX
{
        int m;
        int p;
        int q;
}MAX;

int CheckPalindrome(int m)
{
        int n=0,quotient=m,remainder;
        while(0!=quotient)
        {
                remainder=quotient%10;
                n=10*n+remainder;
                quotient=quotient/10;                               
        }
        if(n==m)
        {
                return 1;
        }
        else
        {
                return 0;
        }
}

int main()
{
        int m,p,q;
        MAX.m=0;
        for(p=999;p>99;p--)
        {
                for(q=999;q>99;q--)
                {
                        m=p*q;
                        if(CheckPalindrome(m))
                        {
                                if(m>MAX.m)
                                {
                                        MAX.m=m;
                                        MAX.p=p;
                                        MAX.q=q;
                                }
                        }
                }
        }
        printf("%d=%d*%d\n",MAX.m,MAX.p,MAX.q);
        return 0;

阿bang 发表于 2018-3-26 16:58:38

def isPalindrome(num):
    l = []
    while num:
      l.append(num % 10)
      num /= 10
    k = l[:]
    l.reverse()
    if k == l:
      return True
    else:
      return False


temp = 0
for i in range(999, 100, -1):
    for j in range(i, 100, -1):
      if isPalindrome(i * j):
            temp = max(temp, i * j)
print temp

refracted_ray 发表于 2018-4-12 22:46:07

本帖最后由 refracted_ray 于 2018-4-12 22:48 编辑

import copy

# 判断n是否回文数
def if_pr_num(n):
        str_n=str(n) # 把整数n转换为字符串
        list_n=list(str_n) # 把字符串转换为列表
        list_n_copy=copy.deepcopy(list_n) # 对list_n进行一次深复制(在本题中浅复制是没用的)
        list_n_copy.reverse() # 倒转list_n_copy
       
        # 若倒转后依然和原列表相同,说明n是回文数
        if list_n==list_n_copy:               
                return True

pa_num=[] #所有三位数乘积的回文数,每一项都是回文数及其因子的元组

for i in range(999,99,-1):
        for j in range(999,99,-1):
                n=i*j
                if if_pr_num(n):
                        pa_num.append((n,i,j))

pa_num.sort(reverse=True) # 以n为第一优先级,把pa_num按从大到小排列
print ('三位数乘积最大的回文数是:%d=%d*%d'%pa_num)

结果是906609=993*913。不过运行速度比较慢,大概五六秒钟才出结果

zzzgod 发表于 2018-6-20 16:59:47

本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:04 编辑

#include <iostream>
using namespace std;
int main()
{
        int i=999,j=999,hui;
        for(i;i>0;--i)
        {
                j=i%10*100+(i%100-i%10)+(i-i%100)/100;
                hui=i*1000+j;
                for(int i=999;hui/i<1000;--i)
                {
                        if(hui%i==0)
                        {
                                cout<<i<<' '<<hui/i;
                                return 0;
                        }
                }
        }
}

名字有点夸张 发表于 2018-7-16 17:10:32

#include <cstdio>
#include <cstring>
#include <ctime>
#include <cstdlib>

//交换字符串
void swap(char * s, char * f, int len)
{
        for (int i = len; i > 0; i--)
        {
                f = s;
        }
        f = '\0';
}
int main(int argc, char * argv[])
{
        time_t clock = time(0);
        long int sum;
        char str, fstr;
        int temp = 0;//标记使循环退出
        for (long int s = 998001; s > 10000; s--)
        {
                sprintf(str, "%lu", s);
                swap(str, fstr, strlen(str));
                if (!strcmp(str, fstr))
                {
                        for (long int i = 999; i > 100; i--)
                        {
                                for (long int j = 999; j > 100; j--)
                                {
                                        if (i * j == s)
                                        {
                                                printf("%lu * %lu = %lu\n", i, j, s);
                                                temp = 1;
                                                if (temp)
                                                        break;
                                        }
                                }
                                if (temp)
                                        break;
                        }
                }
                if (temp)
                        break;
        }
        printf("time = %d", time(0) - clock);
        fputc('\n', stdout);
        system("pause");
        return 0;
}

结果为 993 * 913 = 906609

塔利班 发表于 2018-8-23 16:51:10

def fun():
    L=[]
    for i in range(999,99,-1):
      for j in range(999,99,-1):
            a=str(i*j)
            if a==a[::-1]:
                L.append(i*j)
    return max(L)

DetConan 发表于 2018-9-3 17:11:57

用python3写的,耗时3毫秒,其实代码是用带你学c带你飞里面c语言写的程序改过来的,外加了python特性的翻转字符串
仅供参考,如有改进意见望指出
# 找出最大的有由个三位数乘积构成的回文数。
import time

start = time.clock()
n = 1998
maxnum = 0
while (n >= 200):
    i = (n + 1) // 2
    j = n - i
    while (i <= 999 and i * j > maxnum):
      x = i * j
      y = int(str(x)[::-1])
      if y == x:
            maxnum = x
            p = i
            q = j
      i += 1
      j -= 1
    n -= 1
print("找到最大回文数:%d=%d*%d" % (maxnum, p, q))
end = time.clock()
print("read:%f s" % (end - start))

shanczp 发表于 2018-10-10 16:22:31

本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:04 编辑

。。写的有点烂,一个判断回文,一个从最大回文开始判断2个3位数的乘积数。。一开始的想法是从小开始往大搜索,最后换成直接判断最大位。。{:10_266:}
int num=998001;//999*999最大值
        while (true)
        {
                if (huiwen(num))
                {
                        zhishu(num);
                        if(zhishu(num)==1)
                        {
                                return;
                        }
                        //printf("%d\n",num);
                        //return;
                }
                num--;
        }
//判断回文
int huiwen(int a)
{
        int m;
        int sum=0;
        m=a;
        while(m)
        {
                sum=sum*10+m%10;
                m/=10;
        }
        if (sum==a)
        {
                return true;
        }
        else
        {
                return false;
        }
}


int zhishu(int num)
{
       
        int n=1;
        int sum=num;
        int j=0;
        while (true)
        {
                int i=999;
                for(;i>=100;i--)
                {
                        if(num%i==0)
                        {
                                n=i;
                                break;
                        }
                        if(i==100)
                        {return 0;}
                }
                num=num/n;
                if(num==1)
                {
                        printf("%d\n",sum);
                        return 1 ;
                }
               
        }
}

cupbbboom 发表于 2018-11-20 17:53:17

list_1 = []
for i in range(101,1000):
        for n in range(i,1000):
                list_2 =
                for each in list_2:       # for each in :不过这样子写:n就取不到
                        if str(each) == str(each)[::-1]:
                                print(each,end=",")
                                list_1.append({'x1':i,'x2':n,'result':each})
print("\n"+'*'*50)
my_result = max(list_1,key=lambda x:x['result'])
print('输出最大回文结果:%s * %s = %s' %(str(my_result['x1']),str(my_result["x2"]),str(my_result['result'])))

最大结果是:913 * 993 = 906609


yuc_mi 发表于 2018-12-4 15:30:38

本帖最后由 yuc_mi 于 2018-12-4 16:12 编辑

#一个回文数指的是从左向右和从右向左读都一样的数字。

#最大的由两个两位数乘积构成的回文数是 9009 = 91 * 99。

#找出最大的有由个三位数乘积构成的回文数。

def product(begin, end):
    list1 = []
    for x in range(begin, end):
      for y in range(begin, end):
            num = x * y
            flag = huiwen(num)
            if flag:
                #可以输出你所设置区间的所有回文数
                #print('%d = %d * %d 是回文数'% (num, x, y))
               list1.append({'result': num,'x':x,'y':y})

    larger = max(list1,key = lambda x: x['result'] )
    print(larger)
    print('%d = %d * %d 是区间{%d, %d}最大回文数' \
          % (larger['result'], larger['x'], larger['y'], begin, end))
               
def huiwen(number):
    string = str(number)
    length = len(string)
    for i in range(length//2):
      if string == string:
            continue
      else:
            return False
    return True
      
      

print('please inout digital range')
begin = int(input('begin:'))      
end = int(input('end:'))         

product(begin, end)

result

please inout digital range
begin:100
end:1000
{'result': 906609, 'x': 913, 'y': 993}
906609 = 913 * 993 是区间{100, 1000}最大回文数

何小胖胖 发表于 2019-2-19 17:20:37

本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:05 编辑

回文数不难判断,有很多方法,但是总觉得能找出一种方法就是只要判断到最大就break,但是不知道怎么去判断。一开始就是从100++到999,后来发现倒着来只判断前900个可以大大减少运行时间,改进回文的判断方法还能提高速度
#include<iostream>
#include<time.h>
using namespace std;
int main() {
        clock_t start,end;
        int value=0,number,k,n,test,max=0;
        int a,b;
        start=clock();
        for(int i=999;i>900;i--){
                for(int j=i;j>900;j--){
                        n=0;
                        test=1;
                        value=i*j;
                        //将一个数分解到数组中,方便把每一位拿出来作比较
                        while(value>0){
                                k=value%10;
                                number=k;
                                n++;
                                value/=10;
                        }
                        k=0;
                        //判断回文
                        for(n=n-1,k;n>0,n>k;n--,k++){
                                if(number!=number){
                                        test=0;
                                        break;
                                }
                        }
                        //找出最大的回文数
                        if(test==1) {
                                if(i*j>max){
                                        max=i*j;
                                        a=i;
                                        b=j;
                                }
                        }
                }
        }
        cout<<"最大的回文数是:"<<a<<"*"<<b<<"="<<max<<endl;
        end=clock();
        cout<<endl<<"费时:        "<<end-start;
        return 0;
}

996982937 发表于 2019-2-22 10:35:20

本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:05 编辑

#include<stdio.h>
void main()
{
        int a,b,n;
        int max=0,i=0,j=0;
       
        for(a=999;a>100;a--)
        {
                for(b=999;b>100;b--)
                {
                        n=a*b;
                        if(n>100000&&n<=999999)
                        {
                                if((n/100000==n%10)&&((n/10000)%10==(n%10)/10)&&((n/1000)%10==(n/100)%10))
                                {
                                        if (n>max)
                                        {
                                                max=n;
                                                i=a;
                                                j=b;
                                        }
                                       
                                }
                        }
                        else if(n<100000&&n>10000)
                        {
                                        if((n/10000==n%10)&&((n/1000)%10==(n%100)/10))
                                {
                                        if (n>max)
                                        {
                                                max=n;
                                                i=a;
                                                j=b;
                                        }
                                }
                        }
                       
                }
        }
        printf("%d*%d=%d\n",i,j,max);
}
输出结果:
993*913=906609
用时0.56s

zs86787 发表于 2019-3-20 13:52:23

本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:05 编辑

wyc1gg 发表于 2015-10-8 17:38
def int_reverse(x):
    '求一个数的反转:1234得到4321'
    x1 = str(x)


def dight(a):
    str_a = str(a)
    len_a = len(str_a)//2
    a1 = list(str_a[:len_a])
    a2 = list(reversed(str_a))
    if a1 == a2:
      return True
ls = []
for i in range(100,1000):
    for j in range(100,1000):
      if dight(i*j):
            ls.append(i*j)
print(max(ls))

王小召 发表于 2019-4-10 14:42:21

运行结果:906609
运行时间:1.2636081

import time

def get_huiwen():
    x_l = []
    y_l = []
    z_l = []
    for x in range(0, 900):
      for y in range(0, 900):
            z = (999 - x) * (999 - y)
            if judge_huiwen(z):
                x_l.append(999 - x)
                y_l.append(999 - y)
                z_l.append(z)
    return max(z_l)

def easy_way():
    for i in range(0, 999*999 - 1000):
      t = 999*999 - i
      if judge_huiwen(t):
            return t   

def judge_huiwen(target):
    num_list = []
    if target < 10:
      print("当前值过小!")
    while target:
      num_list.append(target % 10)
      target = target//10
    lenth = len(num_list)
    if lenth % 2:
      return False
    else:
      for i in range(lenth//2):
            if num_list != num_list:
                return False
      return True

print(get_huiwen())
print(time.process_time())

ietar 发表于 2019-4-19 21:27:06

本帖最后由 ietar 于 2019-4-19 21:29 编辑

python

>>> p4()

>>> timef(p4(),number=1000)
8.076700000003711e-05


from timef import timef
def p4():
    l1=[]
    result=
    for i in range(999,99,-1):
      if 999*i < result:
            return result
      for j in range(999,99,-1):
            if str(i*j)==str(i*j)[::-1]:
                if i*j > result:
                  result =
    return result



页: 1 2 3 [4] 5 6 7
查看完整版本: 题目4:找出由两个三位数乘积构成的回文