永恒的蓝色梦想 发表于 2019-8-3 10:25:40

本帖最后由 永恒的蓝色梦想 于 2020-5-10 16:26 编辑

def reverse(n):
    res=0
    while n:
      res=res*10+n%10
      n//=10
    return res

max=0

for i in range(100,1000):
    for j in range(100,1000):
      j*=i
      if j>max and reverse(j)==j:
            max=j

print(max)

RRRex 发表于 2019-8-7 18:33:22

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

#include <stdio.h>
#include <time.h>


int main()
{
    int begin_time, end_time;
    begin_time = clock();

    int i, j, num, temp, index, length, flag = 0, biggest;
    for (i = 100; i < 999; i++)
    {
      for (j = i; j < 999; j++)
      {
            num = i * j;
            for (index = 0; num; index++)
            {
                temp = num % 10;
                num = num / 10;
            }
            length = index - 1;
            for (index = length; index >= 0; index--)
            {
                if (temp == temp)
                {
                  flag = 1;
                }
                else
                {
                  flag = 0;
                  break;
                }
            }
            if (flag == 1)
            {
                biggest = i * j;
                printf("%d = %d * %d\n", biggest, i, j);
            }
      }
    }

    end_time = clock();
    printf("\n程序一共运行%dms\n", end_time - begin_time);

    return 0;
}

justjust001 发表于 2019-8-31 23:42:21

#include <stdio.h>

int main()
{
        int begin = clock();
        char p;
        int num = 0;
        int x, y, len, i, j;


        for (x = 100; x < 1000; x++)
                for (y = 100; y < 1000; y++)
                        if (x * y > num)
                        {
                                itoa(x * y, p, 10);
                                if ((len = strlen(p)) % 2 == 0)                //数字个数必须为偶数
                                {
                                        for (i = 0, j = len - 1; i < j; i++, j--)
                                                if (p != p)
                                                        break;
                                        if (i > j)
                                                num = x * y;
                                }
                        }
               
        printf("最大的有由个三位数乘积构成的回文数 = %d\n", num);
        int end = clock();
        printf("time = %dms\n", end - begin);
        system("pause");
        return 0;
}

华博文 发表于 2019-9-27 11:23:43

本帖最后由 华博文 于 2019-9-27 11:31 编辑

import time

def pan(nu):
    pas = "pas"
    wen = str(nu)
    yuan = 0
    for each in range(1 , len(wen) // 2 + 1):
      if wen != wen:
            #print("fir" + wen)
            #print("sec" + wen)
            #print(wen)
            pas = "!="
            break
   
    return pas
   

def run():
    zidian = dict()
    for fir in range(999 , 100 , -1):
      for sec in range(999 , 100 , -1):
            result = fir * sec
            gui = pan(result)
            if gui == "pas":
                zidian =
                #return fir , sec , result

    return zidian

time_start = time.perf_counter()
form = run()
miao = time.perf_counter() - time_start

print("最大回文数为:{}\n由{} * {}构成\n运行时间为:{:.2f}秒 由|-- Clownc --|提供~~".format
      (max() , form)] , form)] , miao))
            

1666194196 发表于 2019-10-8 17:13:33

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

#include <stdio.h>
void main(){
        //回文数就是从前往后和从后往前读都一样的数。由两个2位数相乘得到的最大回文乘积是 9009 = 91 × 99。
        //找出由两个3位数相乘得到的最大回文乘积。
        int i,j,max=0,x,y;//两个三位数 i,j;最大回文数max,回文数的因数x,y
        long chengji;//i*j的乘积
        for(i=100;i<1000;i++){//i:100开始到999
                for(j=100;j<1000;j++){//j:100开始 到999
                        chengji=i*j; //i=100 *j从100到999;i=101 *j从100到999;循环899*899次
                        if(chengji>max){       
                                if(chengji>100000){//最大的肯定在6位数中
                                        int ge;
                                        ge = chengji%10;//拿出个位这个数
                                        int shi;
                                        shi = chengji/10%10;//拿出十位这个数
                                        int bai;
                                        bai = chengji/100%10;//拿出百位这个数
                                        int qian;
                                        qian = chengji/1000%10;//拿出千位这个数
                                        int wan;
                                        wan = chengji/10000%10;//拿出万位这个数
                                        int shiwan;
                                        shiwan = chengji/100000;//拿出十万位这个数
                                       
                                        if(ge==shiwan&&shi==wan&&bai==qian){//回文特征:第一位与最后一位相等,第二位与十位相等...
                                                printf("回文数=%d\n",chengji);
                                                max = chengji;   //把最后一个(最大的)赋给max,两个因数给x,y
                                                x = i;                       
                                                y = j;
                                        }
                                               
                                }
                        }       
                }
        }
        printf("\n");
        printf("最大回文数为:%d\n这两个三位数为:%d、%d",max,x,y);//循环外面 输出这些数
}

带上面具的孩纸 发表于 2019-10-19 20:32:48

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

int IsPalindrome()
{
    int i,j;
    int count;
    int Temp = 0;//临时存放回文数
    int Palindrome;
    int MAX = 0;

    for(i = 100;i < 1000;i++)
    {
      for(j = 100;j < 1000;j++)
      {
            count = i * j;

            Palindrome = count;

            while(count != 0)
            {
                Temp = Temp * 10 + count % 10;
                count /= 10;
            }

            if(Palindrome == Temp)
            {
                if(MAX < Temp)
                {
                  MAX = Temp;
                }
            }
            Temp = 0;
      }
    }
    return MAX;
}

int main(void)
{
    int Palindrome;//回文数

Palindrome = IsPalindrome();

printf("%d\n",Palindrome);

system("pause");

    return 0;
}

guoquanli 发表于 2019-12-31 15:51:19

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

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//判断一个数是回文数字
bool IsPaLindrome(int n){
    if( n > 998001){
      return false;
    }
    if( n >= 10000 && n < 100000){
      int a = {0};
      int Index = 0;
      int value = 0;
      while(n != 0){
            value = n%10;
            a = value;
            n = n/10;
      }
      for(int i = 0; i<3 ; i++){
            if(a != a){
                return false;
            }
      }
      return true;
    }else{
      int a = {0};
      int Index = 0;
      int value = 0;
      while(n != 0){
            value = n%10;
            a = value;
            n = n/10;
      }
      for(int i = 0; i<3 ; i++){
            if(a != a){
                return false;
            }
      }
      return true;
    }
}
void main(){
    int result = 0;
    int a,b;
    for(int i = 100; i<1000; i++){
      for(int j = 100; j<1000; j++){
            if(IsPaLindrome(i*j)){
                if(i*j >result){
                  result = i*j;
                  a = i;
                  b = j;
                }
            }
      }
    }
    printf("finally value is %d[%d,%d]\n",result,a,b);
    return;
}
==================================================
finally value is 906609

代号-K 发表于 2020-3-12 15:46:18

本帖最后由 代号-K 于 2020-3-12 15:49 编辑

经过了几个小时的努力,终于想出了最优的方法
1: 9 = 1 * 9
2: 9009 = 91 * 99
3: 906609 = 913 * 993
4: 98100189 = 9811 * 9999
5: 2811991182 = 34034 * 82623
6 位之后电脑不支持了
#define BIT_FLAG 5
#define BIT_MAX(BIT_FLAG+1)*2 - 1
#define BIT_MINBIT_FLAG*2 - 1
#define MAX_NUM 9
void getHuiWen(int k, int *array, int m, ElementType *result)
{
    int n = k - 1 - m;
    if(m <= n)
    {
      int i;
      for(i = 1; i <= MAX_NUM; i++)
      {
            array = i;
            array = i;
            int j = 0;
            ElementType sum = 0;
            while( j < k)
            {
                //printf("%d", array);
                sum += array*int(pow(10,k-j-1));
                j++;
            }
            // optimization
            if(*result >= sum)
            {

                if(*result >= sum * 10)
                {
                  return;
                }
                continue;
            }
            j = int (pow(10, BIT_FLAG - 1));
            while(j <= int (pow(10, BIT_FLAG) - 1))
            {
                if(sum % j == 0)
                {
                  //printf("%d\n", sum);
                  int ret;
                  ret = (sum / j) / int (pow(10, BIT_FLAG - 1));
                  if(ret > 0 && ret < 10)
                  {
                        ret = sum / j;
                        printf("%lld = %d * %d\n", sum, j, ret);
                        *result = sum;
                        break;
                  }

                }
                j++;
            }

            //clear numbers in middle
            if(i == MAX_NUM)
            {
                j = 1;
                while( j < k-1)
                {
                  array = 0;
                  j++;
                }
            }
            //ecursive
            getHuiWen(k, array, m+1, result);
      }
    }
}

int main(int argc, char *argv[])
{
    int k = BIT_MAX;
    int array = {0};
    ElementType ret = -1;
    for(; k >= BIT_MIN; k--)
    {
      getHuiWen(k, array, 0, &ret);
    }
    //int sum = calculateCircle();
    printf("%lld\n",ret);
    return 0;
}

永恒的蓝色梦想 发表于 2020-4-29 14:05:46

本帖最后由 永恒的蓝色梦想 于 2020-5-7 19:23 编辑

C++ 6ms#include<iostream>
using namespace std;


int main() {
    int i, j, k, temp, reversed, res = 0;

    for (i = 100; i < 1000; i++) {
      for (j = 100; j < 1000; j++) {
            if ((k = i * j) > res) {
                reversed = 0;
                temp = k;

                while (temp) {
                  reversed = reversed * 10 + temp % 10;
                  temp /= 10;
                }

                if (reversed == k) {
                  res = k;
                }
            }
      }
    }

    cout << res << endl;
    return 0;
}

leon0149 发表于 2020-5-7 12:37:28

本帖最后由 leon0149 于 2020-5-9 10:32 编辑

C 0.018 s
#include <stdio.h>
#include <time.h>

int reverse(int);
void compare(void);

int reverse(int num) {
    int completed = 0;
    do
    {
      completed = (num % 10) + completed * 10;
      num /= 10;
    }while(num);
    return completed;
}

void compare(void)
{
    int i, j;
    int max = 0;
    int temp;
    int o, p;
    for (i = 0; i < 1000; i++) {
      for (j = 0; j < 1000; j++) {
            if (i * j == reverse(i * j)) {
                temp = i * j;
                if (max < temp){
                  max = temp;
                  o = i;
                  p = j;
//                  printf("%d * %d = %d\n", o, p, max);
                }
            }
      }
    }
    printf("%d * %d = %d\n", o, p, max);
}

int main(void) {
    clock_t start, finish;
    double duration;
    start = clock();
    compare();
    finish = clock();
    duration = (double)(finish - start) / CLOCKS_PER_SEC;
    putchar('\n');
    printf("%.3f", duration);
    return 0;
}

leon0149 发表于 2020-5-7 14:21:08

本帖最后由 leon0149 于 2020-5-7 15:28 编辑

def isPalindrome(x):
    x = str(x)
    return x == x[::-1]


max = 0

for i in range(999, 99, -1):
    for j in range(999, 99, -1):
      num = i * j
      if isPalindrome(num):
            max = num if max < num else max

print(max)

永恒的蓝色梦想 发表于 2020-5-7 14:43:20

leon0149 发表于 2020-5-7 14:21


你的程序有很明显的问题。
你的程序中计算了1000与其他数的积,没有计算100与其他数的积,得出正确答案纯属运气。

leon0149 发表于 2020-5-7 15:28:47

永恒的蓝色梦想 发表于 2020-5-7 14:43
你的程序有很明显的问题。
你的程序中计算了1000与其他数的积,没有计算100与其他数的积,得出正确答案 ...

ok没注意 谢谢指正

数据小随从 发表于 2020-6-11 20:50:41

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


int isprime(int num)
{
        int i;
        for (i = 2; i < num; i++)
        {
                if (num%i == 0)
                        break;
        }
        if (i >= num)
                return 1;
}


void main()
{
        double start, finish;
        int j;
        long long sum = 0;
        start = clock();
        for (j = 2; j < 200000; j++)
        {
                if (isprime(j) == 1)
                {
                        sum += j;
                }
        }
        finish = clock();
        printf("两百万以内的质数和为 = %lld\n", sum);
        printf("\n耗时%lf s\n", (finish - start)/CLOCKS_PER_SEC);
        system("pause");
}

输出为:二十万以内的质数和为 = 1709600813

耗时8.616000 s
百万耗时太长,输出了二十万的结果

KingFish-v- 发表于 2020-8-10 21:44:42

答案是993*913=906609,用时0.01s左右。

找4位数x4位数的最大回文用时也在0.01s内,5位数x5位数用时0.58s,6位数0.37秒,7位数一百万到一千万用了143秒(应该这种情况就需要更好的算法了)。

import time
starttime = time.time()
##########################用时检测##################
#回文检测函数就是最普通地把数字变成列表然后翻转进行比较
#思路的话是生成两个倒过来的列表(100-1000变为1000-100),从大到小检测
#然后每次一个循环后把列表中的第一个数字去掉,因为已经计算过一次了
#当出现回文时停止该循环,同时把列表中第二个列表中比当前数字小的都去掉
#因为比第二个乘数小但是第一个乘数大的可能性都检测过了
#接下来继续循环,每当乘积小于已经存在的回文时就进入下一个循环
#当第一个列表中第一个数字比第二个列表中最后一个数字小的时候就不可能出现更大的回文了


def check(number):                        #回文检测函数
    result = list(str(number))            
    result2 = result[:]
    result2.reverse()
    if result == result2:
      resultlist.append(number)
      return True
    else:
      return False

def startfunc(list1, list2):               
    for each in list2:
      result = list1 * each
      if result < resultlist[-1]:         
            break
      if check(result):
            resultequation.append(str(list1)+"*"+str(each)+"="+str(result))#将乘法式加入对应列表
            list2 = list2      #把列表2中比当前数字小的都切片切掉
            listB.clear()
            listB.extend(list2)         #清空原先的列表2并将切片后的列表放进去
            break
      
resultlist =                         #列表装符合要求的乘积
resultequation = []                     #列表装符号要求的乘积的乘法式

'''这里设定数字范围'''
listA = list(range(100,1000))         
listB = list(range(100,1000))

listA.reverse()
listB.reverse()


while listA > listB[-1]:             #此时不可能出现更大的乘积了,循环结束
    startfunc(listA,listB)
    listA.pop(0)                        #去掉两个列表中的第一个数字(已经算过)
    listB.pop(0)

print(resultequation[-1])

##############################################
endtime = time.time()
print(endtime - starttime)

永恒的蓝色梦想 发表于 2020-8-10 22:34:12

代号-K 发表于 2020-3-12 15:46
经过了几个小时的努力,终于想出了最优的方法
1: 9 = 1 * 9
2: 9009 = 91 * 99


99979 * 99681 = 9966006699{:10_277:}

永恒的蓝色梦想 发表于 2020-8-10 22:34:54

KingFish-v- 发表于 2020-8-10 21:44
答案是993*913=906609,用时0.01s左右。

找4位数x4位数的最大回文用时也在0.01s内,5位数x5位数用时0.58 ...

不错,我也学习一下{:10_275:}

yhhpf 发表于 2020-8-21 16:37:59

a = 1000
b = 1000
l1 = []
while a > 99:
    a -= 1
    b = 1000
    while b >99:
      b -= 1
      s = a*b
      c = list(str(s))
      i = len(c)
      x = 1
      while x <= int(i/2) :
            if c != c:
                break
            if x == int(i/2):
                l1.append(s)
                break
            x += 1
print(max(l1))


基本解法,忙完回头看~~~

a315734685 发表于 2020-9-1 17:19:43

# 一个回文数指的是从左向右和从右向左读都一样的数字。最大的由两个两位数乘积构成的回文数是 9009 = 91 * 99。
# 找出最大的有由个三位数乘积构成的回文数。
def huiwen(x):
    y = str(x)[::-1]
    if int(y) == x:
      return True
    else:
      return False

max_Num = 0
for i in range(100, 999):
    for j in range(100, 999):
      x = j * i
      if huiwen(x):
            if max_Num < x:
                max_Num = x

print(max_Num)

有马_冬巳 发表于 2020-10-2 12:16:19

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

palindrome = []

def ispalindrome(num):
    s = str(num)
    a = 0
    b = len(s)-1
    check = 0
    for i in range(int((len(s)/2))):
      if len(s) % 2 != 0:
            return False
      if s != s:
            if check == 0:
                check += 1
            if check != 0:
                break
      a += 1
      b -= 1
    if check == 0:
      return True

def multiply(num1,num2):
    for number1 in range(num1, 99, -1):
      for number2 in range(num2, 99, -1):
            number = number1*number2
            if ispalindrome(number):
                palindrome.append()

def getbiggestpalindrome():
    temp = 0
    re = 0
    for i in range(len(palindrome)-1):
      if temp < palindrome:
            temp = palindrome
            re = i
    print(palindrome)

start_palindrome = time.time()
multiply(999,999)
getbiggestpalindrome()
time_palindrome = time.time() - start_palindrome
print("%f秒" %time_palindrome)



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