当前位置: 代码迷 >> 综合 >> 欧拉工程第36题:Double-base palindromes
  详细解决方案

欧拉工程第36题:Double-base palindromes

热度:77   发布时间:2023-12-13 07:15:15.0

题目链接:https://projecteuler.net/problem=36
这个数是十进制的回文数也是二进制的回文数,求小于一百万的这样的数之和。
思路:
1.判断十进制数是不是回文数
2.若是,把十进制数转换成二进制数
3.判断二进制数是不是回文数

如何判断回文数:
把数转换成字符串,对称位置是否相等,全部对称位置相对是回文数。

Java代码:

package projecteuler31to40;import java.util.Date;class level36{
    void solve2(){int Max_Value=1000000;int sum=0;for(int i=1;i<Max_Value;i++){if(JudgePalindromic(i) && JudgePalindromic(Integer.toBinaryString(i))){sum+=i;}}System.out.println(sum);}void solve(){int Max_Value=1000000;int sum=0;for(int i=1;i<Max_Value;i++){String str=String.valueOf(i);if(JudgePalindromic(str)){String binary=DecimalToBinary(i);if(JudgePalindromic(binary)){sum+=i;
// System.out.println(i);}}}System.out.println(sum);}String DecimalToBinary(int num){String str="";while(num!=0){int by=num%2;str=by+str;num/=2;}return str;}boolean JudgePalindromic(String str){
// String str=String.valueOf(num);for(int i=0;i<str.length()/2;i++){if(str.charAt(i)!=str.charAt(str.length()-i-1))return false;}return true;}boolean JudgePalindromic(int num){String str=String.valueOf(num);for(int i=0;i<str.length()/2;i++){if(str.charAt(i)!=str.charAt(str.length()-i-1))return false;}return true;}
}
public class Problem36 {
    public static void main(String[] args){Date beginTime=new Date();new level36().solve();//872187Date endTime=new Date();long Time=endTime.getTime()-beginTime.getTime();System.out.println("Time:"+Time/1000+"s"+Time%1000+"ms");}}

结果:

872187
Time:0s154ms

Python代码:

import time
from numpy import binary_reprdef is_palindrome(s):"""Input: A string s.Output: Whether or not s is a palindrome."""return s == s[::-1]def double_base_palindromes(n):"""Input: A natural number n.Output: The sum of all numbers less than n thatare palindromic both in decimal and binary."""# Start with all odd single-digit numbers, then# add 33 and 99, the only palindromic two-digit numbers# that are also palindromic in binaryresult = 0for i in range(1, n, 2):if is_palindrome(str(i)) and is_palindrome(binary_repr(i)):result += ireturn resultn = 1000000t0 = time.time()
ans = double_base_palindromes(n)
t1 = time.time()
elapsed = t1 - t0print("Found " + str(ans) + " in " + str(round(elapsed, 5)) + " seconds")

上面程序在题解中复制的
结果:

Found 872187 in 0.856 seconds

Python Help

from numpy import binary_repr

导入二进制模块,把十进制数转换成二进制

关于list下标
这里写图片描述

list[x:]
x>=0 取出从下标x开始的以后的所有元素
x<0 取出倒数abs(x)个元素,注意:-1就是最后一个元素的下标,其实与x>0是一样的

list[:x]
取出下标x以前的所有元素

list[::-1] 实现的是逆序

这里写图片描述

  相关解决方案