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

题目链接: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();//872187
        Date 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_repr

def 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 that are 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 binary
    result = 0
    for i in range(1, n, 2):
        if is_palindrome(str(i)) and is_palindrome(binary_repr(i)):
            result += i
    return result



n = 1000000

t0 = time.time()
ans = double_base_palindromes(n)
t1 = time.time()
elapsed = t1 - t0

print("Found " + str(ans) + " in " + str(round(elapsed, 5)) + " seconds")

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

Found 872187 in 0.856 seconds

Python Help

from numpy import binary_repr

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

关于list下标
欧拉工程第36题:Double-base palindromes_第1张图片

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

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

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

欧拉工程第36题:Double-base palindromes_第2张图片

你可能感兴趣的:(java,python,欧拉工程,十进制数,二进制数)