2010-09-26 16 views
13

मैं इसएक्स संख्या से कम दो की सबसे बड़ी शक्ति पाएं?

def power_two(n, base = -1): 
    result = 2 ** base 
    if result < n: 
     base += 1 
     power_two(n, base) 
    else: 
     if result == n: 
      print base 
     else: 
      print base - 1 

क्या एक्स संख्या से कम दो में से सबसे बड़ी शक्ति को खोजने के लिए pythonic तरीका है कर रही हूँ?

संपादित उदाहरण: power_two (100) वापसी केवल सत्ता

+1

जब आप कम कहते हैं, तो क्या आपका मतलब "कम या बराबर" या "सख्ती से कम" है? दूसरे शब्दों में, अगर एन 2 की सटीक शक्ति है, तो उदाहरण के लिए 32 क्या वापस आना चाहिए? –

+3

लॉगरिदम का उपयोग करने के बारे में "पायथनिक" क्या है? वे पाइथन के पूर्ववर्ती हैं 377 साल या उससे भी ज्यादा। –

+0

@ बस मेरा सही विकल्प: इसके बजाय आप क्या सुझाव देंगे? –

उत्तर

26

लघुगणक का पता लगाएं और यह काटना:

def power_two(n): 
    return int(math.log(n, 2)) 
+0

धन्यवाद, लेकिन मुझे यह वापसी 6 "2 ** 6" के बजाय 64 – user422100

+0

@mark: मेरा मतलब है केवल 6 लौटाना, "2 ** 6" यह बताना था कि 6 कहां से आया है, लेकिन आप मुझे एक पाइथनिक देते हैं रास्ता, धन्यवाद – user422100

+0

@ उपयोगकर्ता 422100: ठीक है, अब मैं समझता हूं। –

6

दो तरीके, पहले अजगर 2.7 में ही काम करता है और हो सकता है 3+:

import random 
for number in (random.randint(0,1<<32) for _ in range(16)): 
    print "%20i,%4i, %4i" % (number, number.bit_length()-1, len(bin(number))-3) 
+1

द्विआधारी नकारात्मक होने पर -3 भाग को गड़बड़ कर दिया जाएगा। –

15

आप bit_length() इस्तेमाल कर सकते हैं:

def power_two(n): 
    return n.bit_length() - 1 
n != 0 के लिए

परिभाषा के अनुसार: 2**(n.bit_length()-1) <= abs(n) < 2**n.bit_length()

+1

यह एक अच्छा समाधान है, हालांकि वास्तव में टोनी Veijalainen वास्तव में इसे पहले ही पोस्ट कर दिया है - यह सिर्फ उसका जवाब कम स्पष्ट है। मैंने इसे +1 करने के लिए पहली बार उसे +1 किया और यह भी उल्लेख करने के लिए कि उसे पाइथन 2.7 या नए की आवश्यकता है जो एक बहुत ही वास्तविक चिंता है - कई उपयोगकर्ता अभी भी पायथन 2.6 पर हैं। –

+0

@ मार्क बेयर्स: मैंने टोनी वेजालेनैन को भी वोट दिया है (यह -1 था)। पायथन 2.7 सीपीथॉन का वर्तमान संस्करण है इसलिए मैं इसका स्पष्ट रूप से उल्लेख नहीं करता (मैं काम पर 2.4 का उपयोग करता हूं, इसलिए मैं समझता हूं कि आप कहां से आ रहे हैं)। जब मैंने आपका जवाब देखा तो मैंने सोचा कि कुछ थोड़ा उलझन समाधान (एमएसबी) होना चाहिए। 'long.bits_in_digit()' सार्वजनिक नहीं है इसलिए 'bit_length()' अगली सबसे अच्छी बात है। – jfs

-2

उम अच्छी तरह से मुझे यकीन है कि अन्य सुझाव काम कर रहा हूँ, लेकिन मुझे लगता है कि वे बहुत धीमी गति से प्रदर्शन करेंगे। मैंने वास्तव में किसी भी गति को सत्यापित नहीं किया है, लेकिन यह बेहद तेज़ होना चाहिए!

यह जावा में भी है। तो आपको इसे बदलने की आवश्यकता होगी।

public static int getPowerOfTwo(int size) 
{ 
    int n = -1; 
    while (size >> ++n > 0); 
    return (1 << n - 1 == size) ? size : 1 << n; 
} 

public static int getNextPowerOfTwo(int size) 
{ 
    int n = -1; 
    while (size >> ++n > 0); 
    return 1 << n; 
} 

public static int getPreviousPowerOfTwo(int size) 
{ 
    int n = -1; 
    while (size >> ++n > 0); 
    return 1 << n - 1; 
} 
संबंधित मुद्दे