鱼C论坛

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

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

  [复制链接]
发表于 2017-9-29 16:52:52 | 显示全部楼层
AArdio编译:
  1. import console;
  2. import time.timer

  3. console.setTitle("test");

  4. time.timer.start();

  5. var is_reversed = function(n){
  6.         s_n = tostring(n);
  7.         r_n = string.reverse(s_n);
  8.         return s_n == r_n
  9. }

  10. var max_n = 0
  11. for(j=999;100;-1){
  12.         for(i=999;100;-1){
  13.                 if is_reversed(i*j){
  14.                         if(i*j>max_n){
  15.                                 max_n = i*j;
  16.                                 break;
  17.                         };
  18.                 }
  19.                 if i*j<max_n{
  20.                         break;
  21.                 }
  22.         }
  23. }

  24. console.print(max_n);
  25. console.print(time.timer.endTick());
  26. console.pause();
  27. console.close()
复制代码

906609
26.249376773834 (毫秒)
请按任意键继续 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-2 19:45:11 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:03 编辑

python3:

  1. n=999
  2. while n>100:
  3.     a=str(n*n)
  4.     b=str(n*n-n)
  5.     if a==a[::-1]:
  6.         print('回文数为',a,'由',n,'和',n,'组成')
  7.         break
  8.     if b==b[::-1]:
  9.         print('回文数为',b,'由',n,'和',n-1,'组成')
  10.         break
  11.     n-=1
复制代码


'回文数为 698896 由 836 和 836 组成'
如果考虑不同数字的话,只用考虑变量b.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-4 13:27:35 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:04 编辑

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

  2. int ispalindromic(int n)
  3. {
  4.         int xn=0,xn1;
  5.         int temp=n;
  6.         while (n/10)
  7.         {
  8.                 xn1=n%10;
  9.                 xn=xn*10+xn1;
  10.                 n=n/10;
  11.         }
  12.         xn=xn*10+n;
  13.         if (temp==xn)
  14.         {
  15.                 return 1;
  16.                
  17.         }
  18.         else
  19.         {
  20.                 return 0;
  21.         }
  22. }

  23. int isthree(int n)
  24. {
  25.         for (int i=999; i>=100; i--)
  26.         {
  27.                 if(n%i==0 && n/i>100 && n/i<999 )
  28.                
  29.                 {
  30.                         printf("%d * %d =",i,n/i);
  31.                         return 1;
  32.                 }
  33.         }
  34.        
  35.         return 0;
  36. }

  37. int main(void)
  38. {


  39.                 for(int i=998001; i>100000; i--)
  40.                 {
  41.                         if( ispalindromic(i) && isthree(i))
  42.                         {
  43.                                 printf("%d",i);
  44.                                 break;
  45.                         }
  46.                 }
  47.        
  48. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-8 18:00:42 | 显示全部楼层
  1. #include <stdio.h>

  2. int isPalindrome(int);

  3. int isPalindrome(int num)
  4. {
  5.     int revNum = 0;
  6.     int tmp = num;
  7.     while(tmp != 0)
  8.     {
  9.         revNum = revNum * 10 + tmp % 10;
  10.         tmp /= 10;
  11.     }

  12.     return num == revNum;
  13. }

  14. int main(void)
  15. {   
  16.     int multi, result, a, b;
  17.     for (int i = 100; i <= 999; i++)
  18.     {
  19.         for (int j = i + 1; j <= 999; j++)
  20.         {
  21.             multi = i * j;
  22.             if (isPalindrome(multi) && result < multi)
  23.             {
  24.                 result = multi;
  25.                 a = i;
  26.                 b = j;
  27.             }
  28.         }
  29.     }
  30.     printf("%d * %d = %d\n", a, b, result);
  31.     return 0;
  32. }

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

使用道具 举报

发表于 2018-3-4 17:00:45 | 显示全部楼层
  1. #include<stdio.h>
  2. int CheckPalindrome(int m)
  3. {
  4.         int n=0,quotient=m,remainder;
  5.         while(0!=quotient)
  6.         {
  7.                 remainder=quotient%10;
  8.                 n=10*n+remainder;
  9.                 quotient=quotient/10;                               
  10.         }
  11.         if(n==m)
  12.         {
  13.                 return 1;
  14.         }
  15.         else
  16.         {
  17.                 return 0;
  18.         }
  19. }
  20. int main()
  21. {
  22.         int m,p,q;
  23.         for(p=999;p>100;p--)
  24.         {
  25.                 for(q=999;q>100;q--)
  26.                 {
  27.                         m=p*q;
  28.                         if(CheckPalindrome(m))
  29.                         {
  30.                                 printf("%d=%d*%d\n",m,p,q);
  31.                                 goto END;
  32.                         }
  33.                 }
  34.         }
  35. END:
  36.         return 0;
  37. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-4 18:18:24 | 显示全部楼层
之前的代码没考虑好最大值,这里进行修改用MAX将最大的记录下来
  1. #include<stdio.h>
  2. struct MAX
  3. {
  4.         int m;
  5.         int p;
  6.         int q;
  7. }MAX;

  8. int CheckPalindrome(int m)
  9. {
  10.         int n=0,quotient=m,remainder;
  11.         while(0!=quotient)
  12.         {
  13.                 remainder=quotient%10;
  14.                 n=10*n+remainder;
  15.                 quotient=quotient/10;                               
  16.         }
  17.         if(n==m)
  18.         {
  19.                 return 1;
  20.         }
  21.         else
  22.         {
  23.                 return 0;
  24.         }
  25. }

  26. int main()
  27. {
  28.         int m,p,q;
  29.         MAX.m=0;
  30.         for(p=999;p>99;p--)
  31.         {
  32.                 for(q=999;q>99;q--)
  33.                 {
  34.                         m=p*q;
  35.                         if(CheckPalindrome(m))
  36.                         {
  37.                                 if(m>MAX.m)
  38.                                 {
  39.                                         MAX.m=m;
  40.                                         MAX.p=p;
  41.                                         MAX.q=q;
  42.                                 }
  43.                         }
  44.                 }
  45.         }
  46.         printf("%d=%d*%d\n",MAX.m,MAX.p,MAX.q);
  47.         return 0;
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-26 16:58:38 | 显示全部楼层
  1. def isPalindrome(num):
  2.     l = []
  3.     while num:
  4.         l.append(num % 10)
  5.         num /= 10
  6.     k = l[:]
  7.     l.reverse()
  8.     if k == l:
  9.         return True
  10.     else:
  11.         return False


  12. temp = 0
  13. for i in range(999, 100, -1):
  14.     for j in range(i, 100, -1):
  15.         if isPalindrome(i * j):
  16.             temp = max(temp, i * j)
  17. print temp
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-12 22:46:07 | 显示全部楼层
本帖最后由 refracted_ray 于 2018-4-12 22:48 编辑
  1. import copy

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

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

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

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


结果是906609=993*913。不过运行速度比较慢,大概五六秒钟才出结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-20 16:59:47 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:04 编辑
  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.         int i=999,j=999,hui;
  6.         for(i;i>0;--i)
  7.         {
  8.                 j=i%10*100+(i%100-i%10)+(i-i%100)/100;
  9.                 hui=i*1000+j;
  10.                 for(int i=999;hui/i<1000;--i)
  11.                 {
  12.                         if(hui%i==0)
  13.                         {
  14.                                 cout<<i<<' '<<hui/i;
  15.                                 return 0;
  16.                         }
  17.                 }
  18.         }
  19. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-16 17:10:32 | 显示全部楼层
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <ctime>
  4. #include <cstdlib>

  5. //交换字符串
  6. void swap(char * s, char * f, int len)
  7. {
  8.         for (int i = len; i > 0; i--)
  9.         {
  10.                 f[len - i] = s[i - 1];
  11.         }
  12.         f[len] = '\0';
  13. }
  14. int main(int argc, char * argv[])
  15. {
  16.         time_t clock = time(0);
  17.         long int sum;
  18.         char str[7], fstr[7];
  19.         int temp = 0;  //标记使循环退出
  20.         for (long int s = 998001; s > 10000; s--)
  21.         {
  22.                 sprintf(str, "%lu", s);
  23.                 swap(str, fstr, strlen(str));
  24.                 if (!strcmp(str, fstr))
  25.                 {
  26.                         for (long int i = 999; i > 100; i--)
  27.                         {
  28.                                 for (long int j = 999; j > 100; j--)
  29.                                 {
  30.                                         if (i * j == s)
  31.                                         {
  32.                                                 printf("%lu * %lu = %lu\n", i, j, s);
  33.                                                 temp = 1;
  34.                                                 if (temp)
  35.                                                         break;
  36.                                         }
  37.                                 }
  38.                                 if (temp)
  39.                                         break;
  40.                         }
  41.                 }
  42.                 if (temp)
  43.                         break;
  44.         }
  45.         printf("time = %d", time(0) - clock);
  46.         fputc('\n', stdout);
  47.         system("pause");
  48.         return 0;
  49. }
复制代码


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

使用道具 举报

发表于 2018-8-23 16:51:10 | 显示全部楼层
  1. def fun():
  2.     L=[]
  3.     for i in range(999,99,-1):
  4.         for j in range(999,99,-1):
  5.             a=str(i*j)
  6.             if a==a[::-1]:
  7.                 L.append(i*j)
  8.     return max(L)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-3 17:11:57 | 显示全部楼层
用python3写的,耗时3毫秒,其实代码是用带你学c带你飞里面c语言写的程序改过来的,外加了python特性的翻转字符串
仅供参考,如有改进意见望指出
  1. # 找出最大的有由个三位数乘积构成的回文数。
  2. import time

  3. start = time.clock()
  4. n = 1998
  5. maxnum = 0
  6. while (n >= 200):
  7.     i = (n + 1) // 2
  8.     j = n - i
  9.     while (i <= 999 and i * j > maxnum):
  10.         x = i * j
  11.         y = int(str(x)[::-1])
  12.         if y == x:
  13.             maxnum = x
  14.             p = i
  15.             q = j
  16.         i += 1
  17.         j -= 1
  18.     n -= 1
  19. print("找到最大回文数:%d=%d*%d" % (maxnum, p, q))
  20. end = time.clock()
  21. print("read:%f s" % (end - start))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 16:22:31 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:04 编辑

。。写的有点烂,一个判断回文,一个从最大回文开始判断2个3位数的乘积数。。一开始的想法是从小开始往大搜索,最后换成直接判断最大位。。
  1. int num=998001;//999*999最大值
  2.         while (true)
  3.         {
  4.                 if (huiwen(num))
  5.                 {
  6.                         zhishu(num);
  7.                         if(zhishu(num)==1)
  8.                         {
  9.                                 return;
  10.                         }
  11.                         //printf("%d\n",num);
  12.                         //return;
  13.                 }
  14.                 num--;
  15.         }
  16. //判断回文
  17. int huiwen(int a)
  18. {
  19.         int m;
  20.         int sum=0;
  21.         m=a;
  22.         while(m)
  23.         {
  24.                 sum=sum*10+m%10;
  25.                 m/=10;
  26.         }
  27.         if (sum==a)
  28.         {
  29.                 return true;
  30.         }
  31.         else
  32.         {
  33.                 return false;
  34.         }
  35. }


  36. int zhishu(int num)
  37. {
  38.        
  39.         int n=1;
  40.         int sum=num;
  41.         int j=0;
  42.         while (true)
  43.         {
  44.                 int i=999;
  45.                 for(;i>=100;i--)
  46.                 {
  47.                         if(num%i==0)
  48.                         {
  49.                                 n=i;
  50.                                 break;
  51.                         }
  52.                         if(i==100)
  53.                         {return 0;}
  54.                 }
  55.                 num=num/n;
  56.                 if(num==1)
  57.                 {
  58.                         printf("%d\n",sum);
  59.                         return 1 ;
  60.                 }
  61.                
  62.         }
  63. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 17:53:17 | 显示全部楼层
  1. list_1 = []
  2. for i in range(101,1000):
  3.         for n in range(i,1000):
  4.                 list_2 = [i * n]  
  5.                 for each in list_2:       # for each in [i * n for n in range(i,1000)]:  不过这样子写:n就取不到
  6.                         if str(each) == str(each)[::-1]:
  7.                                 print(each,end=",")
  8.                                 list_1.append({'x1':i,'x2':n,'result':each})
  9. print("\n"+'*'*50)
  10. my_result = max(list_1,key=lambda x:x['result'])
  11. print('输出最大回文结果:%s * %s = %s' %(str(my_result['x1']),str(my_result["x2"]),str(my_result['result'])))
复制代码


最大结果是:913 * 993 = 906609


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

使用道具 举报

发表于 2018-12-4 15:30:38 | 显示全部楼层
本帖最后由 yuc_mi 于 2018-12-4 16:12 编辑
  1. #一个回文数指的是从左向右和从右向左读都一样的数字。

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

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

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

  14.     larger = max(list1,key = lambda x: x['result'] )
  15.     print(larger)
  16.     print('%d = %d * %d 是区间{%d, %d}最大回文数' \
  17.           % (larger['result'], larger['x'], larger['y'], begin, end))
  18.                
  19. def huiwen(number):
  20.     string = str(number)
  21.     length = len(string)
  22.     for i in range(length//2):
  23.         if string[i] == string[length - i - 1]:
  24.             continue
  25.         else:
  26.             return False
  27.     return True
  28.         
  29.         

  30. print('please inout digital range')
  31. begin = int(input('begin:'))        
  32. end = int(input('end:'))         

  33. product(begin, end)
复制代码


result

please inout digital range
begin:100
end:1000
{'result': 906609, 'x': 913, 'y': 993}
906609 = 913 * 993 是区间{100, 1000}最大回文数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-19 17:20:37 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:05 编辑

回文数不难判断,有很多方法,但是总觉得能找出一种方法就是只要判断到最大就break,但是不知道怎么去判断。一开始就是从100++到999,后来发现倒着来只判断前900个可以大大减少运行时间,改进回文的判断方法还能提高速度
  1. #include<iostream>
  2. #include<time.h>
  3. using namespace std;
  4. int main() {
  5.         clock_t start,end;
  6.         int value=0,number[7],k,n,test,max=0;
  7.         int a,b;
  8.         start=clock();
  9.         for(int i=999;i>900;i--){
  10.                 for(int j=i;j>900;j--){
  11.                         n=0;
  12.                         test=1;
  13.                         value=i*j;
  14.                         //将一个数分解到数组中,方便把每一位拿出来作比较
  15.                         while(value>0){
  16.                                 k=value%10;
  17.                                 number[n]=k;
  18.                                 n++;
  19.                                 value/=10;
  20.                         }
  21.                         k=0;
  22.                         //判断回文
  23.                         for(n=n-1,k;n>0,n>k;n--,k++){
  24.                                 if(number[n]!=number[k]){
  25.                                         test=0;
  26.                                         break;
  27.                                 }
  28.                         }
  29.                         //找出最大的回文数
  30.                         if(test==1) {
  31.                                 if(i*j>max){
  32.                                         max=i*j;
  33.                                         a=i;
  34.                                         b=j;
  35.                                 }
  36.                         }
  37.                 }
  38.         }
  39.         cout<<"最大的回文数是:"<<a<<"*"<<b<<"="<<max<<endl;
  40.         end=clock();
  41.         cout<<endl<<"费时:        "<<end-start;
  42.         return 0;
  43. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-22 10:35:20 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:05 编辑
  1. #include<stdio.h>
  2. void main()
  3. {
  4.         int a,b,n;
  5.         int max=0,i=0,j=0;
  6.        
  7.         for(a=999;a>100;a--)
  8.         {
  9.                 for(b=999;b>100;b--)
  10.                 {
  11.                         n=a*b;
  12.                         if(n>100000&&n<=999999)
  13.                         {
  14.                                 if((n/100000==n%10)&&((n/10000)%10==(n%10)/10)&&((n/1000)%10==(n/100)%10))
  15.                                 {
  16.                                         if (n>max)
  17.                                         {
  18.                                                 max=n;
  19.                                                 i=a;
  20.                                                 j=b;
  21.                                         }
  22.                                        
  23.                                 }
  24.                         }
  25.                         else if(n<100000&&n>10000)
  26.                         {
  27.                                         if((n/10000==n%10)&&((n/1000)%10==(n%100)/10))
  28.                                 {
  29.                                         if (n>max)
  30.                                         {
  31.                                                 max=n;
  32.                                                 i=a;
  33.                                                 j=b;
  34.                                         }
  35.                                 }
  36.                         }
  37.                        
  38.                 }
  39.         }
  40.         printf("%d*%d=%d\n",i,j,max);
  41. }
复制代码

输出结果:
993*913=906609
用时0.56s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)

  1. def dight(a):
  2.     str_a = str(a)
  3.     len_a = len(str_a)//2
  4.     a1 = list(str_a[:len_a])
  5.     a2 = list(reversed(str_a[len_a:]))
  6.     if a1 == a2:
  7.         return True
  8. ls = []
  9. for i in range(100,1000):
  10.     for j in range(100,1000):
  11.         if dight(i*j):
  12.             ls.append(i*j)
  13. print(max(ls))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-10 14:42:21 | 显示全部楼层
运行结果:906609
运行时间:1.2636081

  1. import time

  2. def get_huiwen():
  3.     x_l = []
  4.     y_l = []
  5.     z_l = []
  6.     for x in range(0, 900):
  7.         for y in range(0, 900):
  8.             z = (999 - x) * (999 - y)
  9.             if judge_huiwen(z):
  10.                 x_l.append(999 - x)
  11.                 y_l.append(999 - y)
  12.                 z_l.append(z)
  13.     return max(z_l)

  14. def easy_way():
  15.     for i in range(0, 999*999 - 1000):
  16.         t = 999*999 - i
  17.         if judge_huiwen(t):
  18.             return t   

  19. def judge_huiwen(target):
  20.     num_list = []
  21.     if target < 10:
  22.         print("当前值过小!")
  23.     while target:
  24.         num_list.append(target % 10)
  25.         target = target//10
  26.     lenth = len(num_list)
  27.     if lenth % 2:
  28.         return False
  29.     else:
  30.         for i in range(lenth//2):
  31.             if num_list[i] != num_list[lenth - i - 1]:
  32.                 return False
  33.         return True

  34. print(get_huiwen())
  35. print(time.process_time())
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-19 21:27:06 | 显示全部楼层
本帖最后由 ietar 于 2019-4-19 21:29 编辑

python

>>> p4()
[906609, 993, 913]
>>> timef(p4(),number=1000)
8.076700000003711e-05


  1. from timef import timef
  2. def p4():
  3.     l1=[]
  4.     result=[0,0,0]
  5.     for i in range(999,99,-1):
  6.         if 999*i < result[0]:
  7.             return result
  8.         for j in range(999,99,-1):
  9.             if str(i*j)==str(i*j)[::-1]:
  10.                 if i*j > result[0]:
  11.                     result = [i*j,i,j]
  12.     return result



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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 13:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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