2017-06-04 36 views
-1

我很快把一些Python代碼放在​​一起來測試我的知識。我試圖在不使用字符串的情況下檢測「多個迴文」。這裏是我的代碼:這是一個超過1個基地的迴文嗎?

from math import log 
from math import ceil 
from math import floor 

palindrome = 0 

def palindromify(half, base): 
    assert base != 0 
    reversedhalf = 0 
    palindrome = 0 
    iterator = 0 
    size = floor(log(half, base)) + 1 
    """ 
     for base = 10 and half = 100, 
     log10(100) = 2, floored + 1 = 2 + 1 = 3. 

     for base = 10 and half = 999, 
     log10(999) = 2.9... (or something). 
     floored + 1 = 2 + 1 = 3. 

     size = digits. 
    """ 
    palindrome = half * (base ** size) 
    while iterator < size: 
     digit = floor(half/(base ** iterator)) % base 
     reversedhalf = (base ** (size - iterator - 1)) * digit + reversedhalf 
     iterator = iterator + 1 
    palindrome = reversedhalf + palindrome 
    return palindrome 

def depalindromify(whole, base): 
    halfsize = (ceil(log(whole,base))/2) 
    """ 
     if the half is 100 and base = 10, whole = 100001. 
     log10(100001) = just over 5 
     ceil(just above 5) = 6 
     6/2 = 3. And 100 is 3 digits! 

     if the half is 999 and base = 10, whole = 999999. 
     log10(999999) = just under 6. 
     ceil(just under 6) = 6 
     6/2 = 3. 999 is 3 digits. 
    """ 
    halfbottom = whole % (base ** halfsize) 
    halftop = (whole - halfbottom)/(base ** halfsize) 
    """ 
     (whole - (whole % (base ** halfsize)))/(base ** halfsize) 
     if base = 10, whole = 526625, 
     (526625 - (526625 mod 1000))/(1000) 
     = (526625 - 625)/1000 
     = (526000)/1000 
     = 526 
    """ 
    return halftop 

""" 
    Does not work 
""" 
def multipalindrome(): 
    current = 2 
    currentbase = 2 
    palindromed = 0 
    dun = False 
    highest = 2 
    while True: 
     dun = False 
     current = (highest ** 4) if current < (highest ** 4) else current + 1 
     currentbase = 2 
     while not dun: 
      palindromed = palindromify(current, currentbase) 
      currentbase = currentbase + 1 
      depalindromed = depalindromify(palindromed, currentbase) 
      print '(D) depalindromed = ', depalindromed 
      if (current != depalindromed): ## here 
       if currentbase > highest: 
        print 'New highest! In bases from 2 to ', currentbase, ', top half ', current, '!\n' 
       highest = currentbase 
       dun = True 

multipalindrome() 



# x = input("Enter first half: ") 
# y = input("Enter base:  ") 
# 
# print palindromify(x, y) 

我已經添加了""" comments """,以幫助自己瞭解小區和地板的功能。基本上,multipalindrome()應運行一個無限循環,選擇一個數字,對其進行回覆,並查看該回文是否是超過1個基數的迴文。它試圖做到這一點足以得到所有基地的迴文(這可能不會發生)。我不知道在哪裏,只要檢測多個迴文,並在功能使用的基地,等去..

當我運行這個使用Python解釋器(2.7),我得到:

... 
(D) depalindromed = 30657.0 
(D) depalindromed = 30657.0 
(D) depalindromed = 30658.0 
(D) depalindromed = 30659.0 
(D) depalindromed = 30661.0 
(D) depalindromed = 30661.0 
(D) depalindromed = 30662.0 
(D) depalindromed = 30663.0 
(D) depalindromed = 30664.0 
(D) depalindromed = 30665.0 
(D) depalindromed = 30666.0 
(D) depalindromed = 30667.0 
(D) depalindromed = 30668.0 
(D) depalindromed = 30668.0 
(D) depalindromed = 30670.0 
(D) depalindromed = 30671.0 
(D) depalindromed = 30672.0 
(D) depalindromed = 30672.0 
(D) depalindromed = 30674.0 
(D) depalindromed = 30674.0 
(D) depalindromed = 30676.0 
(D) depalindromed = 30676.0 
(D) depalindromed = 30678.0 
(D) depalindromed = 30678.0 
(D) depalindromed = 30680.0 
(D) depalindromed = 30680.0 
(D) depalindromed = 30681.0 
(D) depalindromed = 30682.0 
(D) depalindromed = 30684.0 
(D) depalindromed = 30684.0 
(D) depalindromed = 30685.0 
(D) depalindromed = 30686.0 
(D) depalindromed = 30688.0 
(D) depalindromed = 30688.0 
(D) depalindromed = 30689.0 
(D) depalindromed = 30690.0 
(D) depalindromed = 30691.0 
(D) depalindromed = 30692.0 
(D) depalindromed = 30693.0 
(D) depalindromed = 30694.0 
(D) depalindromed = 30695.0 
(D) depalindromed = 30695.0 
(D) depalindromed = 30697.0 
(D) depalindromed = 30697.0 
(D) depalindromed = 30699.0 
(D) depalindromed = 30699.0 
(D) depalindromed = 30701.0 
(D) depalindromed = 30701.0 
(D) depalindromed = 30703.0 
(D) depalindromed = 30703.0 
(D) depalindromed = 30704.0 
(D) depalindromed = 30705.0 
(D) depalindromed = 30707.0 
(D) depalindromed = 30707.0 
(D) depalindromed = 30708.0 
(D) depalindromed = 30709.0 
(D) depalindromed = 30711.0 
(D) depalindromed = 30711.0 
(D) depalindromed = 30712.0 
(D) depalindromed = 30713.0 
(D) depalindromed = 30714.0 
(D) depalindromed = 30715.0 
(D) depalindromed = 30716.0 
(D) depalindromed = 30717.0 
(D) depalindromed = 30718.0 
(D) depalindromed = 30718.0 
(D) depalindromed = 30720.0 
(D) depalindromed = 30721.0 
(D) depalindromed = 30722.0 
(D) depalindromed = 30722.0 
(D) depalindromed = 30724.0 
(D) depalindromed = 30725.0 
(D) depalindromed = 30726.0 
(D) depalindromed = 30726.0 
(D) depalindromed = 30727.0 
(D) depalindromed = 30728.0 
(D) depalindromed = 30730.0 
^CTraceback (most recent call last): 
    File "palindrome.py", line 77, in <module> 
    multipalindrome() 
    File "palindrome.py", line 67, in multipalindrome 
    palindromed = palindromify(current, currentbase) 
    File "palindrome.py", line 26, in palindromify 
    reversedhalf = (base ** (size - iterator - 1)) * digit + reversedhalf 
KeyboardInterrupt 
[email protected]:~/code4fun/palindrome$ 

編輯: 問題:我不確定運行什麼檢查來檢測多個迴文。 如果你不明白我想要做什麼,隨時問。謝謝!

+0

你問什麼問題? –

+0

@斯科特獵人,我不知道檢查多個迴文的檢查。剛剛意識到我沒有把足夠的,謝謝,大聲笑 – Alphanumeric

+0

@字母數字:不是*每個*正整數迴文無限多基地?例如,1729在任何基數> = 1730中都是平凡的迴文,因爲它是單個數字。你關心的基地有限制嗎? –

回答

1

首先,由於您使用的是Python,所以您應該充分利用它。請看this link關於如何有效地將任何基地轉換爲任何基地。其次,您可以通過執行str(num) == str(num)[::-1]來檢查一個數字是否是迴文,該數字將返回TrueFalse,具體取決於在任何基數中的所述數字是否是迴文。 [::-1]部分反轉字符串。

+0

我有兩個意見/問題:編輯:(輸入不工作在這裏哈哈)1:所有的基地(像2到無限)? 2:儘量不要使用字符串。謝謝! – Alphanumeric

+0

2至36之間。對不起,應該提到這一點。 –

+0

不用擔心!另外,是否有可能沒有字符串,即int的?謝謝!我真的很喜歡這個答案 – Alphanumeric