কোনও বেসে কোনও পূর্ণসংখ্যাকে একটি স্ট্রিংয়ে রূপান্তর কীভাবে?


202

পাইথন একটি প্রদত্ত বেসের মাধ্যমে একটি স্ট্রিং থেকে পূর্ণসংখ্যার সহজে তৈরি করতে দেয়

int(str, base). 

আমি বিপরীত সম্পাদন করতে চাই: একটি পূর্ণসংখ্যা থেকে একটি স্ট্রিং তৈরি , অর্থাত আমি কিছু ফাংশন চাই int2base(num, base), যেমন:

int(int2base(x, b), b) == x

ফাংশনের নাম / যুক্তির আদেশটি গুরুত্বহীন।

কোন সংখ্যার জন্য xএবং বেস bযে int()গ্রহণ করব।

এটি লেখার জন্য একটি সহজ ফাংশন: আসলে এই প্রশ্নটিতে এটি বর্ণনা করার চেয়ে এটি সহজ। তবে আমার মনে হচ্ছে আমি অবশ্যই কিছু মিস করছি।

আমি ফাংশন সম্পর্কে জানতে bin, oct, hex, কিন্তু আমি তাদের কিছু কারণের জন্য ব্যবহার করতে পারবেন না:

  • পাইথনের পুরানো সংস্করণগুলিতে এই ফাংশনগুলি উপলভ্য নয়, যার সাথে আমার সামঞ্জস্যতা প্রয়োজন (২.২)

  • আমি একটি সাধারণ সমাধান চাই যা বিভিন্ন ঘাঁটির জন্য একইভাবে বলা যেতে পারে

  • আমি 2, 8, 16 বাদে অন্যান্য ঘাঁটিগুলিকে অনুমতি দিতে চাই

সম্পর্কিত


5
আশ্চর্যজনকভাবে কেউ কোনও সমাধান দেয়নি যা নির্বিচারে বড় বেস (1023) এর সাথে কাজ করে। আপনার যদি এটির প্রয়োজন হয় তবে আমার সমাধানটি পরীক্ষা করুন যা প্রতিটি বেসের জন্য কাজ করে (2 ইনফ থেকে) স্ট্যাকওভারফ্লো.com
সালভাদোর ডালি

উত্তর:


98

পাইথনের প্রাচীন সংস্করণগুলির সাথে আপনার যদি সামঞ্জস্যতা প্রয়োজন হয়, আপনি হয় জিএমপি ব্যবহার করতে পারেন (যার মধ্যে একটি দ্রুত, সম্পূর্ণ সাধারণ-ইন-টু-স্ট্রিং রূপান্তর ফাংশন অন্তর্ভুক্ত থাকে এবং যেমন প্রাচীন সংস্করণগুলির জন্য নির্মিত হতে পারে - আপনার পুরানো প্রকাশগুলি চেষ্টা করার প্রয়োজন হতে পারে সাম্প্রতিককগুলি সম্মানজনক পাইথন এবং জিএমপি রিলিজের জন্য পরীক্ষা করা হয়নি, কেবল কিছুটা সাম্প্রতিক বিষয়গুলি), বা কম গতির জন্য কিন্তু বেশি সুবিধার্থে পাইথন কোড ব্যবহার করুন - যেমন, সর্বাধিক সহজ:

import string
digs = string.digits + string.ascii_letters


def int2base(x, base):
    if x < 0:
        sign = -1
    elif x == 0:
        return digs[0]
    else:
        sign = 1

    x *= sign
    digits = []

    while x:
        digits.append(digs[int(x % base)])
        x = int(x / base)

    if sign < 0:
        digits.append('-')

    digits.reverse()

    return ''.join(digits)

8
জাস্ট ইন (জিএমপিআই 2) এর মধ্যে ফানক অ্যালেক্সের কথা বলেছে gmpy2.digits(x, base)
mlvljr

2
এটি আমার নজরে আনা হয়েছিল যে কয়েকটি ক্ষেত্রে একটি বেস প্রয়োজন> 36 এবং তাই খনন করা উচিতdigs = string.digits + string.lowercase + string.uppercase
পল

4
(বা string.digits + string.letters)
কোজিরো

3
রূপান্তর-বেস-এন-টু-স্ট্রিংটি পাইথনের মধ্যে ডিফল্টরূপে কেন অন্তর্ভুক্ত করা হয়নি তার কোনও ধারণা? (এটি জাভাস্ক্রিপ্টে রয়েছে)) হ্যাঁ, আমরা সবাই নিজের প্রয়োগ প্রয়োগ করতে পারি, তবে আমি এই সাইট এবং অন্য কোথাও অনুসন্ধান করে চলেছি এবং তাদের মধ্যে অনেকের কাছে বাগ রয়েছে। মূল বিতরণে একটি পরীক্ষিত, নামকরা সংস্করণ অন্তর্ভুক্ত করা ভাল।
জেসন এস

4
@ Lordscales91 আপনি দশমিক ছাড়ার ক্ষেত্রে পাইথন 2 এর x //= baseমতো আচরণ করে এমনটি ব্যবহার করতে পারেন /=। এই উত্তরটি একটি দাবিত্যাগ এটি পাইথন 2. জন্য অন্তর্ভুক্ত করা উচিত
বাস্তবগুণ-রহিত

100

আশ্চর্যের বিষয় হল, লোকেরা কেবলমাত্র এমন সমাধান দিয়েছিল যা ছোট ঘাঁটিতে রূপান্তরিত হয় (ইংরেজী বর্ণমালার দৈর্ঘ্যের চেয়ে ছোট)। এমন কোনও সমাধান দেওয়ার চেষ্টা করা হয়নি যা কোনও যথেচ্ছ বেসকে 2 থেকে অনন্তে রূপান্তর করে।

সুতরাং এখানে একটি দুর্দান্ত সহজ সমাধান:

def numberToBase(n, b):
    if n == 0:
        return [0]
    digits = []
    while n:
        digits.append(int(n % b))
        n //= b
    return digits[::-1]

সুতরাং যদি আপনাকে কিছু অতি বিশাল সংখ্যাকে বেসে রূপান্তর করতে হয় 577,

numberToBase(67854 ** 15 - 102, 577), আপনি একটি সঠিক সমাধান দিতে হবে: [4, 473, 131, 96, 431, 285, 524, 486, 28, 23, 16, 82, 292, 538, 149, 25, 41, 483, 100, 517, 131, 28, 0, 435, 197, 264, 455],

যা আপনি পরে যে কোনও বেসে রূপান্তর করতে পারেন


কলেজে আমি একটি ফাংশন নিয়ে এসেছি যা 20 এর নীচে বেসগুলিকে স্ট্যান্ডার্ড নোটেশন এবং ফর্ম্যাট 20 এবং তারও বেশি 'কোলন সীমাবদ্ধ দশমিক' রূপায়িত করেছে। উদাহরণস্বরূপ, int(4545,16)"11c1" int(4545,60)দিয়েছেন এবং "1:15:45" দিয়েছেন। সুতরাং ফাংশনটি ট্রিপল ডিউটি ​​করেছে: দশমিক, কম্পিউটারিশ এবং টাইমস্ট্যাম্প ফর্ম্যাটগুলিতে রূপান্তর।
পিটার রায়হাম

1
এই পদ্ধতির জন্য বিপরীত কার্য কী?
সোহরাব টি

এটি 3 কারণে জিজ্ঞাসা করা প্রশ্নের উত্তর দেয় না, 1: একটি বিদ্যমান লাইব্রেরি ফাংশনের জন্য প্রশ্নটি প্রয়োগের জন্য নয় 2: প্রশ্নটি একটি স্ট্রিংয়ের জন্য জিজ্ঞাসা করেছিল, এটি একটি তালিকা তৈরি করে 3: এটি কোন অন্তর্নিহিত জন্য নয় (স্ট্রাস্ট, বেস) অন্তর্নির্মিত।
প্লাগওয়াশ

@ প্লাগওয়াশ ১) কোনও এক সময় আপনি লক্ষ্য করবেন যে কখনও কখনও আপনার পছন্দসই কাজগুলি করার জন্য কোনও বিল্টিন লাইব্রেরি ফাংশন নেই, তাই আপনার নিজের লেখা দরকার। আপনি যদি অসম্মতি প্রকাশ করেন তবে একটি বিল্টিন ফাংশন দিয়ে নিজের সমাধান পোস্ট করুন যা একটি বেস 10 নম্বরকে 577 বেসে রূপান্তর করতে পারে 2) এটি কোনও বেসের সংখ্যার অর্থ কী তা বোঝার অভাবের কারণে। 3) আমি আপনাকে কিছুটা চিন্তা করার জন্য উত্সাহিত করি কেন আপনার পদ্ধতির ভিত্তি কেবল n <= 36 এর জন্য কাজ করে Once একবার আপনি কাজটি সম্পন্ন করার পরে এটি স্পষ্ট হবে যে আমার ফাংশনটি কোনও তালিকা ফিরে আসে এবং তার স্বাক্ষর কেন has
সালভাদোর ডালি

1
এটি নেতিবাচক সংখ্যার জন্য কাজ করে না, এবং এটির মৌলিক পরিবর্তন না করে কীভাবে এটি কাজ করা যায় তা সম্পর্কে আমি নিশ্চিত নই। হতে পারে একটি সাইন বিট যোগ করে, 1 বা -1, এর শীর্ষে digits?
wjandrea

89
def baseN(num,b,numerals="0123456789abcdefghijklmnopqrstuvwxyz"):
    return ((num == 0) and numerals[0]) or (baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b])

রেফ: http://code.activestate.com/recines/65212/

এটি হতে পারে সচেতন হন

RuntimeError: maximum recursion depth exceeded in cmp

খুব বড় পূর্ণসংখ্যার জন্য।


5
এর ব্রেভিটি মার্জিত। এটি অ-নেতিবাচক পূর্ণসংখ্যার জন্য পাইথন ২.২.৩ এর অধীনে কাজ করে বলে মনে হচ্ছে। একটি নেতিবাচক সংখ্যা অসীম পুনরাবৃত্তি করে।
মার্ক বর্গারডিং

+1 দরকারী; একটি সমস্যা সংখ্যাসমূহ সঙ্গে '0' শুরু করা হয়নি সংশোধন
sehe

4
এটি নিঃশব্দে ব্যর্থ হয় (ক) যখন বেস হয়> len(numerals), এবং (খ) num % bভাগ্যক্রমে < len(numerals)। উদাহরণস্বরূপ, যদিও numeralsস্ট্রিংটির দৈর্ঘ্য কেবলমাত্র 36 অক্ষর, বেসএন (60, 40) ফিরে আসে '1k'যখন বেসএন (79, 40) একটি উত্থাপন করে IndexError। উভয়েরই একরকম ত্রুটি বাড়াতে হবে। যদি ত্রুটি বাড়াতে কোডটি সংশোধন করা উচিত not 2 <= base <= len(numerals)
ক্রিস জনসন

3
@ তবে, আমার বক্তব্যটি হ'ল লিখিত কোডটি খুব খারাপ উপায়ে ব্যর্থ হয় (নিঃশব্দে, বিভ্রান্তিমূলক উত্তর দেয়) এবং সহজেই সংশোধন করা যায়। আপনি যদি বলছেন যে যদি আপনি আগে থেকেই জানতেন তবে কোনও ত্রুটি bহবে না len(numerals), অবশ্যই , এটি আপনার পক্ষে সৌভাগ্য যে অতিক্রম করবে না ।
ক্রিস জনসন

1
এখানে শর্ট সার্কিটের ব্যবহার অকারণে বিভ্রান্তিকর বলে মনে হচ্ছে ... কেন কেবলমাত্র যদি একটি স্টেট স্টেটমেন্ট ব্যবহার করবেন না ... লাইনটি return numerals[0] if num == 0 else baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b]ঠিক তত সংক্ষেপে।
ইয়ান হিঙ্কস

83
"{0:b}".format(100) # bin: 1100100
"{0:x}".format(100) # hex: 64
"{0:o}".format(100) # oct: 144

46
তবে এটি কি কেবল এই তিনটি ঘাঁটি?
থমাস আহলে 14

3
হ্যাঁ, দুর্ভাগ্যক্রমে আপনি কাস্টম ইন বেসটি নির্দিষ্ট করতে পারবেন না। আরও তথ্য এখানে: docs.python.org/library/string.html#formatstrings
রোস্ট

3
0অপ্রয়োজনীয়। : এখানে পাইথন 2 ডকুমেন্টেশন docs.python.org/2/library/string.html#format-string-syntax
Evgeni Sergeev

7
আপনার সাথে একই ফলাফল অর্জন করতে পারেন hex(100)[2:], oct(100)[2:]এবং bin(100)[2:]
সাসান

2
@ অ্যাভেজেনিসারজিভ: এটি কেবল ২.7 / ৩.১ + এ অপ্রয়োজনীয়। ২.6-এ, স্পষ্ট অবস্থান (বা নাম) প্রয়োজন।
শ্যাডোর্যাঞ্জার

21

দুর্দান্ত উত্তর! আমার অনুমান যে আমার প্রশ্নের উত্তর ছিল "না" আমি কোনও সুস্পষ্ট সমাধান অনুপস্থিত ছিল না। আমি এখানে ফাংশনটি ব্যবহার করব যা উত্তরে প্রকাশিত ভাল ধারণাগুলিকে ঘনীভূত করে।

  • অক্ষরগুলির কলার সরবরাহিত ম্যাপিংয়ের অনুমতি দিন (বেস 64 এনকোডের অনুমতি দেয়)
  • নেতিবাচক এবং শূন্য জন্য পরীক্ষা করে
  • জটিল সংখ্যার স্ট্রিংয়ের টুপলেস ম্যাপ করে


def int2base(x,b,alphabet='0123456789abcdefghijklmnopqrstuvwxyz'):
    'convert an integer to its string representation in a given base'
    if b<2 or b>len(alphabet):
        if b==64: # assume base64 rather than raise error
            alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
        else:
            raise AssertionError("int2base base out of range")
    if isinstance(x,complex): # return a tuple
        return ( int2base(x.real,b,alphabet) , int2base(x.imag,b,alphabet) )
    if x<=0:
        if x==0:
            return alphabet[0]
        else:
            return  '-' + int2base(-x,b,alphabet)
    # else x is non-negative real
    rets=''
    while x>0:
        x,idx = divmod(x,b)
        rets = alphabet[idx] + rets
    return rets


4
আপনি কীভাবে আমাদের ফাংশনের বেস 64 আউটপুটটিকে পূর্ণসংখ্যায় রূপান্তর করতে পারেন?
অবধি

16

পুনরাবৃত্তি

আমি চাই প্রক্রিয়া সহজ সবচেয়ে ভোট উত্তর হবে:

BS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def to_base(n, b): 
    return "0" if not n else to_base(n//b, b).lstrip("0") + BS[n%b]

RuntimeError: maximum recursion depth exceeded in cmpখুব বড় পূর্ণসংখ্যা এবং নেতিবাচক সংখ্যার জন্য একই পরামর্শ সহ । (আপনি ব্যবহার করতে পারেন sys.setrecursionlimit(new_limit))

পুনরাবৃত্ত

করতে পুনরাবৃত্তির সমস্যা এড়ানোর :

BS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def to_base(s, b):
    res = ""
    while s:
        res+=BS[s%b]
        s//= b
    return res[::-1] or "0"

2
সুন্দরভাবে রিফ্যাক্টর, এবং লাইব্রেরি ছাড়াই।
জিম্পাওলো ফেরাদিনী

স্টপ শর্তটি কি return BS[0] if not nতখন হওয়া উচিত নয় ? ঠিক তেমন ক্ষেত্রে যদি আপনি অভিনব অঙ্কগুলি ব্যবহার করতে চান, যেমন আমিও করি :)
আরনাড পি

@ আরনাডপি সম্মত হয়েছে। এটি আমার জন্য কাজ করে:return BS[n] if n < b else to_base(n // b) + BN[n % b]
জেনস

15

পাইথনের একটি স্বেচ্ছাসেবক বেসে একটি পূর্ণসংখ্যা মুদ্রণের জন্য একটি অন্তর্নির্মিত ফাংশন নেই। আপনি চাইলে আপনার নিজের লিখতে হবে।


13

আপনি baseconv.pyআমার প্রকল্প থেকে ব্যবহার করতে পারেন : https://github.com/semente/python-baseconv

নমুনা ব্যবহার:

>>> from baseconv import BaseConverter
>>> base20 = BaseConverter('0123456789abcdefghij')
>>> base20.encode(1234)
'31e'
>>> base20.decode('31e')
'1234'
>>> base20.encode(-1234)
'-31e'
>>> base20.decode('-31e')
'-1234'
>>> base11 = BaseConverter('0123456789-', sign='$')
>>> base11.encode('$1234')
'$-22'
>>> base11.decode('$-22')
'$1234'

উদাহরণস্বরূপ কিছু bultin কনভার্টার হয় baseconv.base2, baseconv.base16এবং baseconv.base64


12

>>> numpy.base_repr(10, base=3) '101'


সুন্দর সমাধান। আমার ক্ষেত্রে, clacলোড-টাইম উদ্বেগের জন্য আমি অদ্ভুততা এড়াচ্ছিলাম । ক্ল্যাকের সাধারণ অভিব্যক্তি মূল্যায়নের রানটাইমের তুলনায় ত্রিগুনের চেয়েও বেশি নাম্বার প্রিলোডিং: উদাহরণস্বরূপ clac 1+1 প্রায় 40 মিমি থেকে 140 মিমি চলে গেছে।
মার্ক বর্গারডিং

1
নোট যে numpy.base_repr()এর বেস হিসাবে সীমা আছে 36। অন্যথায় এটি একটি ছুড়ে ফেলেValueError
sbdchd

যা "ইনট" ফাংশনটিতে নির্মিত সীমাবদ্ধতার সাথে মেলে। বড়
বেসগুলিতে

4

http://code.activestate.com/recipes/65212/

def base10toN(num,n):
    """Change a  to a base-n number.
    Up to base-36 is supported without special notation."""
    num_rep={10:'a',
         11:'b',
         12:'c',
         13:'d',
         14:'e',
         15:'f',
         16:'g',
         17:'h',
         18:'i',
         19:'j',
         20:'k',
         21:'l',
         22:'m',
         23:'n',
         24:'o',
         25:'p',
         26:'q',
         27:'r',
         28:'s',
         29:'t',
         30:'u',
         31:'v',
         32:'w',
         33:'x',
         34:'y',
         35:'z'}
    new_num_string=''
    current=num
    while current!=0:
        remainder=current%n
        if 36>remainder>9:
            remainder_string=num_rep[remainder]
        elif remainder>=36:
            remainder_string='('+str(remainder)+')'
        else:
            remainder_string=str(remainder)
        new_num_string=remainder_string+new_num_string
        current=current/n
    return new_num_string

এখানে একই লিঙ্ক থেকে অন্য একটি

def baseconvert(n, base):
    """convert positive decimal integer n to equivalent in another base (2-36)"""

    digits = "0123456789abcdefghijklmnopqrstuvwxyz"

    try:
        n = int(n)
        base = int(base)
    except:
        return ""

    if n < 0 or base < 2 or base > 36:
        return ""

    s = ""
    while 1:
        r = n % base
        s = digits[r] + s
        n = n / base
        if n == 0:
            break

    return s

বেস 10toN সংখ্যাটি == 0 এর জন্য অ্যাকাউন্ট করে না
ক্রাফ্ট

3

আমি এই জন্য একটি পাইপ প্যাকেজ তৈরি।

আমি আপনাকে আমার বেস.পিটি https://github.com/kamijoutouma/bases.py ব্যবহার করার পরামর্শ দিচ্ছি যা বেসেস.জেএস দ্বারা অনুপ্রাণিত হয়েছিল

from bases import Bases
bases = Bases()

bases.toBase16(200)                // => 'c8'
bases.toBase(200, 16)              // => 'c8'
bases.toBase62(99999)              // => 'q0T'
bases.toBase(200, 62)              // => 'q0T'
bases.toAlphabet(300, 'aAbBcC')    // => 'Abba'

bases.fromBase16('c8')               // => 200
bases.fromBase('c8', 16)             // => 200
bases.fromBase62('q0T')              // => 99999
bases.fromBase('q0T', 62)            // => 99999
bases.fromAlphabet('Abba', 'aAbBcC') // => 300

কোন ঘাঁটি ব্যবহারযোগ্য, তার জন্য https://github.com/kamijoutouma/bases.py# Unknown-basesalphabets দেখুন

সম্পাদনা: পাইপ লিঙ্ক https://pypi.python.org/pypi/bases.py/0.2.2


এটি সুনির্দিষ্ট পরিচিত ঘাঁটির জন্য কবজির মতো কাজ করে ।
আগি হামার্থিফ

এটি এখন পর্যন্ত সেরা উত্তর! এবং পাইপ প্যাকেজিং জন্য ধন্যবাদ!
18

3
def base(decimal ,base) :
    list = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    other_base = ""
    while decimal != 0 :
        other_base = list[decimal % base] + other_base
        decimal    = decimal / base
    if other_base == "":
        other_base = "0"
    return other_base

print base(31 ,16)

আউটপুট:

"1F"


other-baseহিসাবে একই other - base, তাই আপনার ব্যবহার করা উচিতother_base
mbomb007

এছাড়াও, decimalএটি শূন্য হলে সঠিকভাবে কাজ করে না ।
mbomb007

1
>>> import string
>>> def int2base(integer, base):
        if not integer: return '0'
        sign = 1 if integer > 0 else -1
        alphanum = string.digits + string.ascii_lowercase
        nums = alphanum[:base]
        res = ''
        integer *= sign
        while integer:
                integer, mod = divmod(integer, base)
                res += nums[mod]
        return ('' if sign == 1 else '-') + res[::-1]


>>> int2base(-15645, 23)
'-16d5'
>>> int2base(213, 21)
'a3'

1

আগ্রহীদের জন্য একটি পুনরাবৃত্ত সমাধান। অবশ্যই, এটি নেতিবাচক বাইনারি মানগুলির সাথে কাজ করবে না। আপনার দুইয়ের পরিপূরকটি প্রয়োগ করতে হবে।

def generateBase36Alphabet():
    return ''.join([str(i) for i in range(10)]+[chr(i+65) for i in range(26)])

def generateAlphabet(base):
    return generateBase36Alphabet()[:base]

def intToStr(n, base, alphabet):
    def toStr(n, base, alphabet):
        return alphabet[n] if n < base else toStr(n//base,base,alphabet) + alphabet[n%base]
    return ('-' if n < 0 else '') + toStr(abs(n), base, alphabet)

print('{} -> {}'.format(-31, intToStr(-31, 16, generateAlphabet(16)))) # -31 -> -1F

1
def int2base(a, base, numerals="0123456789abcdefghijklmnopqrstuvwxyz"):
    baseit = lambda a=a, b=base: (not a) and numerals[0]  or baseit(a-a%b,b*base)+numerals[a%b%(base-1) or (a%b) and (base-1)]
    return baseit()

ব্যাখ্যা

যে কোনও বেসে প্রতিটি সংখ্যা a1+a2*base**2+a3*base**3..."মিশন" এর সমান হ'ল সমস্তগুলি খুঁজে পাওয়া।

প্রতিটি N=1,2,3...কোড aN*base**Nবি দ্বারা "মউডুলিং" দ্বারা বিচ্ছিন্ন করে চলেছে b=base**(N+1) যার জন্য সমস্ত এন এর চেয়ে বড় বড় করে কেটে দেয় এবং ক্রমটিকে বর্তমানের দ্বারা ডেকে আনা প্রতিটি সময়কে হ্রাস করে তাদের সিরিয়ালটি এন থেকে ছোট হয় এমন সমস্ত টুকরো টুকরো করে aN*base**N

বেস% (বেস -1) == 1 এর জন্য বেস ** পি% (বেস -1) == 1 এবং এর জন্য কিউ = বেস ^ পি% (বেস -১) == কি যখন একটিমাত্র ব্যতিক্রম রয়েছে = যখন = = বেস -১ যা 0 প্রদান করে তা ঠিক করার জন্য 0 টি ফিঙ্কটি যা পরীক্ষা করছে তা পরীক্ষা করা ভিক্ষাবৃত্তি থেকে 0


সুবিধাদি

এই নমুনায় কেবলমাত্র একটি বিভাজন রয়েছে (বিভাগের পরিবর্তে) এবং কিছু মওদুলিউস যা তুলনামূলকভাবে অল্প পরিমাণে সময় নেয়।


1
num = input("number")
power = 0
num = int(num)
while num > 10:
    num = num / 10
    power += 1

print(str(round(num, 2)) + "^" + str(power))

দয়া করে কিছু সংক্ষিপ্ত তথ্য যুক্ত করুন যে আপনি কী বিশেষ উদ্যোগ করেছিলেন
ফারহানা

যদিও এটি লেখকদের প্রশ্নের উত্তর দিতে পারে, এতে কিছু ব্যাখ্যাকারী শব্দ এবং / অথবা ডকুমেন্টেশনের লিঙ্কের অভাব রয়েছে। আশেপাশে কিছু বাক্যাংশ ছাড়া কাঁচা কোড স্নিপেটগুলি খুব বেশি সহায়ক হয় না। আপনি কীভাবে একটি ভাল উত্তর লিখতে পারেন তা খুব সহায়ক। আপনার উত্তর সম্পাদনা করুন।
হেলো

1
def base_changer(number,base):
    buff=97+abs(base-10)
    dic={};buff2='';buff3=10
    for i in range(97,buff+1):
        dic[buff3]=chr(i)
        buff3+=1   
    while(number>=base):
        mod=int(number%base)
        number=int(number//base)
        if (mod) in dic.keys():
            buff2+=dic[mod]
            continue
        buff2+=str(mod)
    if (number) in dic.keys():
        buff2+=dic[number]
    else:
        buff2+=str(number)

    return buff2[::-1]   

এই ফাংশনে আপনি যে কোনও দশমিক সংখ্যা সহজেই আপনার প্রিয় বেসে রূপান্তর করতে পারেন।
মন্টাকামি

আপনার নিজের উত্তর মন্তব্য করার দরকার নেই, ব্যাখ্যা যোগ করতে আপনি এটি সম্পাদনা করতে পারেন।
পোচমুরনিক

1

যে কোনও বেসের সংখ্যাকে অন্য বেসে কীভাবে রূপান্তর করা যায় তার উদাহরণ এখানে।

from collections import namedtuple

Test = namedtuple("Test", ["n", "from_base", "to_base", "expected"])


def convert(n: int, from_base: int, to_base: int) -> int:
    digits = []
    while n:
        (n, r) = divmod(n, to_base)
        digits.append(r)    
    return sum(from_base ** i * v for i, v in enumerate(digits))


if __name__ == "__main__":
    tests = [
        Test(32, 16, 10, 50),
        Test(32, 20, 10, 62),
        Test(1010, 2, 10, 10),
        Test(8, 10, 8, 10),
        Test(150, 100, 1000, 150),
        Test(1500, 100, 10, 1050000),
    ]

    for test in tests:
        result = convert(*test[:-1])
        assert result == test.expected, f"{test=}, {result=}"
    print("PASSED!!!")

0
def dec_to_radix(input, to_radix=2, power=None):
    if not isinstance(input, int):
        raise TypeError('Not an integer!')
    elif power is None:
        power = 1

    if input == 0:
        return 0
    else:
        remainder = input % to_radix**power
        digit = str(int(remainder/to_radix**(power-1)))
        return int(str(dec_to_radix(input-remainder, to_radix, power+1)) + digit)

def radix_to_dec(input, from_radix):
    if not isinstance(input, int):
        raise TypeError('Not an integer!')
    return sum(int(digit)*(from_radix**power) for power, digit in enumerate(str(input)[::-1]))

def radix_to_radix(input, from_radix=10, to_radix=2, power=None):
    dec = radix_to_dec(input, from_radix)
    return dec_to_radix(dec, to_radix, power)

0

আরেকটি ছোট একটি (এবং ইমো বুঝতে সহজ):

def int_to_str(n, b, symbols='0123456789abcdefghijklmnopqrstuvwxyz'):
    return (int_to_str(n/b, b, symbols) if n >= b else "") + symbols[n%b]

এবং যথাযথ ব্যতিক্রম পরিচালনা সহ:

def int_to_str(n, b, symbols='0123456789abcdefghijklmnopqrstuvwxyz'):
    try:
        return (int_to_str(n/b, b) if n >= b else "") + symbols[n%b]
    except IndexError:
        raise ValueError(
            "The symbols provided are not enough to represent this number in "
            "this base")

0

আর একটি সমাধান, বেস 2 থেকে 10 এর সাথে কাজ করে, উচ্চতর বেসগুলির জন্য সংশোধন প্রয়োজন:

def n2b(n, b):
    if n == 0:
        return 0
    d = []
    while n:
        d.append(int(n % b))
        n /= b
    return ''.join(map(str,d[::-1]))

উদাহরণ:

n2b(10,2) => '10100'
int(n2b(10,2),2) => 10

0

এখানে একটি পুনরাবৃত্ত সংস্করণ যা স্বাক্ষরিত পূর্ণসংখ্যা এবং কাস্টম ডিজিটগুলি পরিচালনা করে।

import string

def base_convert(x, base, digits=None):
    """Convert integer `x` from base 10 to base `base` using `digits` characters as digits.
    If `digits` is omitted, it will use decimal digits + lowercase letters + uppercase letters.
    """
    digits = digits or (string.digits + string.ascii_letters)
    assert 2 <= base <= len(digits), "Unsupported base: {}".format(base)
    if x == 0:
        return digits[0]
    sign = '-' if x < 0 else ''
    x = abs(x)
    first_digits = base_convert(x // base, base, digits).lstrip(digits[0])
    return sign + first_digits + digits[x % base]

0

স্ট্রিংগুলি সংখ্যার প্রতিনিধিত্ব করার জন্য একমাত্র পছন্দ নয়: আপনি প্রতিটি সংখ্যার ক্রমের প্রতিনিধিত্ব করতে পূর্ণসংখ্যার একটি তালিকা ব্যবহার করতে পারেন। এগুলি সহজেই একটি স্ট্রিংয়ে রূপান্তরিত হতে পারে।

উত্তরের কোনওটিই বেস <2; এবং বেশিরভাগ খুব ধীরে ধীরে চলবে বা খুব বড় সংখ্যক (যেমন 56789 ** 43210 এর জন্য) স্ট্যাক ওভারফ্লোগুলি সহ ক্র্যাশ হবে । এই ধরনের ব্যর্থতা এড়াতে, এর মতো দ্রুত হ্রাস করুন:

def n_to_base(n, b):
    if b < 2: raise # invalid base
    if abs(n) < b: return [n]
    ret = [y for d in n_to_base(n, b*b) for y in divmod(d, b)]
    return ret[1:] if ret[0] == 0 else ret # remove leading zeros

def base_to_n(v, b):
    h = len(v) // 2
    if h == 0: return v[0]
    return base_to_n(v[:-h], b) * (b**h) + base_to_n(v[-h:], b)

assert ''.join(['0123456789'[x] for x in n_to_base(56789**43210,10)])==str(56789**43210)

স্পিডওয়াইজ, বড় সংখ্যক (আমার মেশিনে প্রায় 0.3s n_to_base) এর সাথে তুলনাযোগ্য strতবে আপনি যদি আপনার সাথে তুলনা করেন hexতবে অবাক হতে পারেন (আমার মেশিনে প্রায় 0.3 মিমি বা 1000x দ্রুত)। কারণটি হ'ল বড় পূর্ণসংখ্যা 256 বেসে (বাইট) মেমোরিতে সংরক্ষণ করা হয়। প্রতিটি বাইটকে কেবল দ্বি-চরিত্রের হেক্স স্ট্রিংয়ে রূপান্তর করা যায়। এই সারিবদ্ধকরণটি কেবলমাত্র দুটি শক্তির ঘাঁটিগুলির জন্য ঘটে, যার কারণে 2,8, এবং 16 (এবং বেস 64, এসকিআই, ইউটিএফ 16, ইউটিফ 32) এর জন্য বিশেষ কেস রয়েছে।

দশমিক স্ট্রিংয়ের শেষ অঙ্কটি বিবেচনা করুন। এটি কীভাবে এটির পূর্ণসংখ্যা গঠন করে বাইটের ক্রমের সাথে সম্পর্কিত? আসুন বাইট লেবেল s[i]সঙ্গে s[0]অন্তত উল্লেখযোগ্য (সামান্য endian) হচ্ছে। তারপরে শেষ সংখ্যাটি sum([s[i]*(256**i) % 10 for i in range(n)])। ঠিক আছে, এটি ঘটে যে 256 ** আমি শেষ করে আই> 0 (6 * 6 = 36) এর জন্য 6 দিয়ে শেষ করব (s[0]*5 + sum(s)*6)%10। এটি থেকে আপনি দেখতে পাচ্ছেন যে শেষ অঙ্কটি সমস্ত বাইটের যোগফলের উপর নির্ভর করে। এই ননলোকাল সম্পত্তিটি যা দশমিককে আরও শক্তিতে রূপান্তরিত করে।


0
def baseConverter(x, b):
    s = ""
    d = string.printable.upper()
    while x > 0:
        s += d[x%b]
        x = x / b
    return s[::-1]

পাইথন 3 এর জন্য আপনার কোড এটি করে: বেসকোনভার্টার (0, 26) -> '' বেসকোনভার্টার (1, 26) -> '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 এর জন্য এটি' 2600 'এর জন্য'> 'এরশিও' এর জন্য '261 -> 1 বেসকোনভার্টার (3, 26) -> 3 বেসকোনভার্টার (5, 26) -> 5 বেসকোনভার্টার (26, 26) -> 10 বেসকোনভার্টার (32, 26) -> 16
ড্রেনফেলস

0

ভাল আমি ব্যক্তিগতভাবে আমার দ্বারা রচিত এই ফাংশনটি ব্যবহার করি

import string

def to_base(value, base, digits=string.digits+string.ascii_letters):    # converts decimal to base n

    digits_slice = digits[0:base]

    temporary_var = value
    data = [temporary_var]

    while True:
        temporary_var = temporary_var // base
        data.append(temporary_var)
        if temporary_var < base:
            break

    result = ''
    for each_data in data:
        result += digits_slice[each_data % base]
    result = result[::-1]

    return result

এইভাবে আপনি এটি ব্যবহার করতে পারেন

print(to_base(7, base=2))

আউটপুট: "111"

print(to_base(23, base=3))

আউটপুট: "212"

আমার কোডে উন্নতি প্রস্তাব দয়া করে নির্দ্বিধায়।


0
def base_conversion(num, base):
    digits = []
    while num > 0:
        num, remainder = divmod(num, base)
        digits.append(remainder)
    return digits[::-1]

0

এটি একটি পুরানো প্রশ্ন তবে আমি ভেবেছিলাম যে আমি এটি গ্রহণ করতে পারব কারণ আমি অনুভব করি যে এটি অন্য উত্তরগুলি থেকে কিছুটা সহজ (2 থেকে 36 পর্যন্ত ঘাঁটির জন্য ভাল):

def intStr(n,base=10):
    if n < 0   : return "-" + intStr(-n,base)         # handle negatives
    if n < base: return chr([48,55][n>9] + n)         # 48 => "0"..., 65 => "A"...
    return intStr(n//base,base) + intStr(n%base,base) # recurse for multiple digits

-1

আমি এখানে কোনও ভাসমান রূপান্তরকারী দেখিনি। এবং আমি সর্বদা তিন অঙ্কের জন্য গ্রুপিং মিস করেছি।

করতে:

বৈজ্ঞানিক মত প্রকাশের সংখ্যা (n.nnnnnn*10**(exp)- '10'হয়self.baseDigits[1::-1]/self.to_string(len (self.baseDigits))

-from_string-ফাংশন।

-বেস 1 -> রোমান সংখ্যা?

- agles সঙ্গে জটিল এর

সুতরাং এখানে আমার সমাধান:

DIGITS = "0123456789abcdefghijklmnopqrstuvwxyz"


# note that the order of the digits is reversed for digits before the point
NO_GROUPING = lambda g: g

concat = "".join
concat_backwards = lambda g: concat(e for e in reversed(list(g)))

def grouping(length = 3, char = '_'):
    def yieldor(digits):
        i = 0
        for d in digits:
            if i == length:
                yield char
                i = 0
            yield d
            i+=1

    return yieldor

class Converter:
    def __init__(self, baseDigits: (int, str), beforePoint = NO_GROUPING, afterPoint = NO_GROUPING, decimalPoint = '.', digitPrecision = 16, trimZeros = True):
        if isinstance(baseDigits, int):
            baseDigits = DIGITS[:baseDigits]
        self.baseDigits = baseDigits

        self.beforePoint = beforePoint
        self.afterPoint  = afterPoint

        self.decimalPoint = decimalPoint
        self.digitPrecision = digitPrecision
        self.trimZeros = trimZeros

    def to_string(self, number: (int, float, complex)) -> str:
        if isinstance(number, complex):
            if number.imag == 0:
                return self.to_string(number.real)
            if number.real == 0:
                return self.to_string(number.imag) + 'j'
            return "({}+{}j)".format(self.to_string(number.real), self.to_string (number.imag))
        if number < 0:
            return '-' + self.to_string(-number)
        digitCount = len(self.baseDigits)
        if isinstance(number, float):
            # round correctly
            precError=digitCount**-self.digitPrecision
            number+=0.5*precError
            if self.trimZeros:
                def yieldor(n):
                    p = precError
                    for i in range(self.digitPrecision):
                        if n <= p:
                            return
                        p *= digitCount
                        n *= digitCount
                        digit = int(n)
                        n -= digit
                        yield self.baseDigits[digit]
            else:
                def yieldor(n):
                    for i in range(self.digitPrecision):
                        n *= digitCount
                        digit = int(n)
                        n -= digit
                        yield self.baseDigits[digit]

            a = concat(self.afterPoint(yieldor(number%1)))

            return (
                self.to_string(int(number)) + (a and self.decimalPoint + a)
            )

        else: #is int
            if not number: return self.baseDigits[0]
            def yieldor(n):
                while n:
                    n, digit = divmod(n, digitCount)
                    yield self.baseDigits[digit]
            return concat_backwards(self.beforePoint(yieldor(number)))

# some tests:
if __name__ == "__main__":
    def conv_test(num, digits, *argv, **kwv):
        print(num, "->", digits if isinstance(digits, int) else "{} ({})".format(len(digits), digits), Converter(digits, *argv, **kwv).to_string(num))
    conv_test(True, "ft")
    conv_test(123, 12, grouping(2))
    conv_test(-0xf00d, 16)
    conv_test(1000, True<<True, grouping(4))
    conv_test(1_000_000, "0+-", beforePoint = grouping(2, '|'))
    conv_test(1.5, 10)
    conv_test(0.999999999, 10, digitPrecision = 8)
    conv_test(-0.1, 10)

    import math
    conv_test(math.pi, 10, afterPoint = grouping(5, ' '))
    conv_test(0.123456789, 10, digitPrecision = 6)

    grSpc = grouping(1, ' ')
    conv_test(math.e, ["off", "on"], grSpc, grSpc, " dot ", digitPrecision = 7)

    conv_test(1 + 1.5j, 10)

    conv_test(50j, 10)

    conv_test(10.01, '-<>')

    # and generate some brainfuck-code here:
    conv_test(1701**42, '+-<>,.][', digitPrecision = 32)

-2
def bn(x,b,ab="0123456789abcdefghijklmnopqrstuvwxyz..."
    a = ""
    while (x>0):
        x,r = divmod(x,n)
        a += ab[r]
    return a[::-1]

bn(2**100, 36)

আউটপুট:

3ewfdnca0n6ld1ggvfgg

যে কোনও বেসে রূপান্তর করতে, বিপরীতটিও সহজ।


পেয়েছেন NameError: global name 'n' is not defined। থাকার divmod(x, n)কথা divmod(x, b)?
wjandrea
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.