পাইথনের একটি পূর্ণসংখ্যার দৈর্ঘ্য


232

পাইথনে, আপনি পূর্ণসংখ্যায় অঙ্কের সংখ্যাটি কীভাবে খুঁজে পাবেন?


1
আমি আপনার প্রশ্ন বুঝতে পারি না। আপনি একটি পূর্ণসংখ্যার আকার বলতে চেয়েছিলেন? আপনি কি সংখ্যার সন্ধান করতে চান? পরিষ্কার করে বলো.
ব্যাটব্র্যাট

উত্তর:


317

আপনি যদি পূর্ণসংখ্যার অঙ্কের সংখ্যার মতো কোনও পূর্ণসংখ্যার দৈর্ঘ্য চান, আপনি সর্বদা এটির স্ট্রিংয়ে রূপান্তর করতে str(133)এবং এর দৈর্ঘ্যের মতো সন্ধান করতে পারেন len(str(123))


18
অবশ্যই আপনি যদি সংখ্যার সংখ্যাটি সন্ধান করেন তবে এটি এমন ফলাফল তৈরি করবে যা নেতিবাচক সংখ্যার জন্য খুব বড়, যেহেতু এটি নেতিবাচক চিহ্নটি গণনা করবে।
ক্রিস আপচর্চ

37
আরে, এটি একটি ধীর সমাধান। আমি এলোমেলো 6 ডিজিটের সংখ্যার একটি ফ্যাকটোরিয়াল করেছি এবং এর দৈর্ঘ্যটি পেয়েছি। এই পদ্ধতিটি 95.891 সেকেন্ড সময় নিয়েছে। এবং Math.log10পদ্ধতিটি গ্রহণ করেছে মাত্র 7.486343383789062e-05 সেকেন্ড, প্রায় 1501388 গুণ দ্রুত!
ফ্যাডকোডার

1
এটি কেবল ধীর নয়, বরং আরও বেশি স্মৃতি ব্যয় করে এবং বিপুল সংখ্যক সমস্যার সৃষ্টি করতে পারে। Math.log10পরিবর্তে ব্যবহার করুন।
পেইম্যান

245

স্ট্রিংতে রূপান্তর ছাড়াই

import math
digits = int(math.log10(n))+1

শূন্য এবং নেতিবাচক সংখ্যাগুলিও পরিচালনা করতে

import math
if n > 0:
    digits = int(math.log10(n))+1
elif n == 0:
    digits = 1
else:
    digits = int(math.log10(-n))+2 # +1 if you don't count the '-' 

আপনি সম্ভবত এটি কোনও ফাংশনে রাখতে চাইবেন :)

এখানে কিছু মানদণ্ড দেওয়া হল। len(str())এমনকি বেশ ছোট সংখ্যার জন্য পিছনে আগে থেকেই

timeit math.log10(2**8)
1000000 loops, best of 3: 746 ns per loop
timeit len(str(2**8))
1000000 loops, best of 3: 1.1 µs per loop

timeit math.log10(2**100)
1000000 loops, best of 3: 775 ns per loop
 timeit len(str(2**100))
100000 loops, best of 3: 3.2 µs per loop

timeit math.log10(2**10000)
1000000 loops, best of 3: 844 ns per loop
timeit len(str(2**10000))
100 loops, best of 3: 10.3 ms per loop

5
এর জন্য লগ 10 ব্যবহার করা গণিতের সমাধান; লেন (টিআর ()) ব্যবহার করা একটি প্রোগ্রামারের সমাধান এবং এটি পরিষ্কার এবং সহজ ler
গ্লেন মেইনার্ড

68
@ গ্লেন: আমি অবশ্যই আশা করি আপনি বোঝাচ্ছেন না এটি একটি খারাপ সমাধান। প্রোগ্রামার এর নিষ্পাপ ও (লগ 10 এন) সমাধান অ্যাড-হক, প্রোটোটাইপিং কোডে ভাল কাজ করে - তবে আমি গণিতবিদদের মার্জিত ও (1) সমাধানটি উত্পাদন কোডে বা কোনও পাবলিক এপিআইতে দেখতে পাচ্ছি। গিনিবলারের জন্য +1
জুলিয়েট

5
@gnibbler: +1। কখনই বুঝতে পারি নি যে লগ 10 কোনও সংখ্যার বিশালতা সন্ধান করতে ব্যবহার করা যেতে পারে। আশা করি আমি আরও একবার ভোট দিতে পারলাম :)।
আব্বাস

14
ওহে! আমি কিছু অদ্ভুত, আপনি করতে পারেন যে কেউ আমাকে কেন ব্যাখ্যা যেতে int(math.log10(x)) +1জন্য 99999999999999999999999999999999999999999999999999999999999999999999999( 71 নবম সংখ্যা ) ফেরৎ 72 ? আমি ভেবেছিলাম যে আমি লগ 10 পদ্ধতিতে নির্ভর করতে পারি তবে এর পরিবর্তে আমাকে লেন (স্ট্র (এক্স)) ব্যবহার করতে হবে :(
মেরেকি

6
আমি বিশ্বাস করি যে অদ্ভুত আচরণের কারণটি আমি জানি, এটি ভাসমান পয়েন্টের ভুলগুলি যেমন eg math.log10(999999999999999)সমান 14.999999999999998তাই int(math.log10(999999999999999))হয় 14। তবে math.log10(9999999999999999)তার সমান 16.0। হতে পারে ব্যবহার roundকরা এই সমস্যার সমাধান।
জামিলাক

43

সমস্ত math.log10 সমাধান আপনাকে সমস্যা দেবে।

math.log10 দ্রুত তবে সমস্যাটি দেয় যখন আপনার সংখ্যা 999999999999997 এর চেয়ে বেশি হয়। কারণ ভাসমানটির পরিমাণ অনেক বেশি s

সমাধানটি হ'ল এই প্রান্তিকের উপরের সংখ্যার জন্য একটি সময়ের কাউন্টার পদ্ধতি ব্যবহার করা।

এটি আরও দ্রুততর করার জন্য, 10 ^ 16, 10 create 17 তৈরি করে নিন এবং তালিকায় ভেরিয়েবল হিসাবে সঞ্চয় করুন। এইভাবে, এটি একটি টেবিল দেখার মতো।

def getIntegerPlaces(theNumber):
    if theNumber <= 999999999999997:
        return int(math.log10(theNumber)) + 1
    else:
        counter = 15
        while theNumber >= 10**counter:
            counter += 1
        return counter

ধন্যবাদ. এটি একটি ভাল পাল্টা উদাহরণ math.log10। বাইনারি উপস্থাপনাগুলি কীভাবে গাণিতিকভাবে ভুল ফলাফল দেয় তার মানগুলি কীভাবে ফ্লপ করে তা দেখতে আকর্ষণীয়।
WloHu

তাহলে লেন (আরআর (
বিঘ্নেশ রাউত

2
@ বিঘ্নেশ রাউত: এবং মাত্রা ধীরে ধীরে
চৈতন্য বঙ্গেরা

"সঠিক ফলাফল প্রদানের ফ্লোটিং-পয়েন্ট অপারেশনগুলির উপর নির্ভর করা বিপজ্জনক" - পাইথন ডেভলপমেন্ট টিমের সদস্য মার্ক ডিকিনসন, বাগস.পিথন.অর্গ
বিস্তৃত

26

পাইথন 2.* intআপনার পাইথন বিল্ডের উপর নির্ভর করে 4 বা 8 বাইট (32 বা 64 বিট) নিতে পারেন। sys.maxint( 2**31-1৩২-বিট ইনটসের 2**63-1জন্য , -৪-বিট ইনটগুলির জন্য) আপনাকে দু'টি সম্ভাবনার মধ্যে কোনটি প্রাপ্ত বলে দেবে।

পাইথন 3-তে, int( longপাইথন 2 এর মতো ) উপলব্ধ মেমরির পরিমাণ পর্যন্ত নির্বিচারে আকার নিতে পারে; sys.getsizeofআপনাকে কোনও নির্দিষ্ট মানের জন্য একটি ভাল ইঙ্গিত দেয়, যদিও এটি কিছু স্থির ওভারহেডও গণনা করে :

>>> import sys
>>> sys.getsizeof(0)
12
>>> sys.getsizeof(2**99)
28

যদি অন্য উত্তরগুলি সূচিত করে, আপনি পূর্ণসংখ্যার মানটির কয়েকটি স্ট্রিং উপস্থাপনের কথা ভাবছেন, তবে lenসেই উপস্থাপনাটি কেবল গ্রহণ করুন , এটি বেস 10 বা অন্যথায় হউক!


দুঃখিত এই উত্তরটি বিয়োগ-সম্পাদনা পেয়েছে। এটি তথ্যবহুল এবং প্রশ্নের প্রশ্রয়জনক বিন্দুর কাছে (যদি এটি 'লেন' পছন্দসই সম্পর্কে আরও সুনির্দিষ্ট হয়)। +1
এমজেভি

এটি আকর্ষণীয় দেখায় তবে কীভাবে দৈর্ঘ্যটি উত্তোলন করা যায় তা নিশ্চিত নয়
টজোররিমারি

17

এই প্রশ্নটি জিজ্ঞাসা করার পরে বেশ কয়েক বছর হয়েছে, তবে আমি পূর্ণসংখ্যার দৈর্ঘ্য গণনা করার জন্য কয়েকটি পদ্ধতির একটি মানদণ্ড সংকলন করেছি।

def libc_size(i): 
    return libc.snprintf(buf, 100, c_char_p(b'%i'), i) # equivalent to `return snprintf(buf, 100, "%i", i);`

def str_size(i):
    return len(str(i)) # Length of `i` as a string

def math_size(i):
    return 1 + math.floor(math.log10(i)) # 1 + floor of log10 of i

def exp_size(i):
    return int("{:.5e}".format(i).split("e")[1]) + 1 # e.g. `1e10` -> `10` + 1 -> 11

def mod_size(i):
    return len("%i" % i) # Uses string modulo instead of str(i)

def fmt_size(i):
    return len("{0}".format(i)) # Same as above but str.format

(libc ফাংশনটির জন্য কিছু সেটআপ প্রয়োজন যা আমি অন্তর্ভুক্ত করি না)

size_expব্রায়ান প্রেসলপস্কির size_strকাছে ধন্যবাদ , ধন্যবাদ গীকতন্ত্রকে, এবংsize_math জানায় এবং জন লা ধন্যবাদ জানায়

ফলাফল এখানে:

Time for libc size:      1.2204 μs
Time for string size:    309.41 ns
Time for math size:      329.54 ns
Time for exp size:       1.4902 μs
Time for mod size:       249.36 ns
Time for fmt size:       336.63 ns
In order of speed (fastest first):
+ mod_size (1.000000x)
+ str_size (1.240835x)
+ math_size (1.321577x)
+ fmt_size (1.350007x)
+ libc_size (4.894290x)
+ exp_size (5.976219x)

(অস্বীকৃতি: ফাংশনটি ইনপুটগুলিতে 1 থেকে 1,000,000 পর্যন্ত চালিত হয়)

এখানে জন্য ফলাফল নেই sys.maxsize - 100000করার sys.maxsize:

Time for libc size:      1.4686 μs
Time for string size:    395.76 ns
Time for math size:      485.94 ns
Time for exp size:       1.6826 μs
Time for mod size:       364.25 ns
Time for fmt size:       453.06 ns
In order of speed (fastest first):
+ mod_size (1.000000x)
+ str_size (1.086498x)
+ fmt_size (1.243817x)
+ math_size (1.334066x)
+ libc_size (4.031780x)
+ exp_size (4.619188x)

যেমন আপনি দেখতে পাচ্ছেন, mod_size( len("%i" % i)) হ'ল দ্রুত, ব্যবহারের চেয়ে সামান্য দ্রুত str(i)এবং অন্যের তুলনায় উল্লেখযোগ্য দ্রুত।


আপনার সত্যিই libc সেটআপ অন্তর্ভুক্ত করা উচিত, libc = ctyle.CDLL('libc.so.6', use_errno=True)(এটি অনুমান করা এটি এটি)। এবং এটি এর চেয়ে বেশি সংখ্যার জন্য কাজ করে না sys.maxsizeকারণ ভাসমান পয়েন্ট সংখ্যাগুলি "খুব বড়" হতে পারে না। সুতরাং উপরের যে কোনও সংখ্যা, আমি অনুমান করি আপনি একটি ধীর পদ্ধতির সাথে আটকে আছেন।
39

15

সংখ্যাটি তার nপরে সংখ্যাটির সংখ্যাটি nদেওয়া হোক:

math.floor(math.log10(n))+1

নোট করুন যে এটি + ve পূর্ণসংখ্যার <10e15- এর জন্য সঠিক উত্তর দেবে। এর বাইরে ফিরে আসা প্রকারের math.log10কিকের যথার্থ সীমাবদ্ধতা এবং উত্তরটি 1 দিয়ে বন্ধ হতে পারে I আমি কেবল এর len(str(n))বাইরে ব্যবহার করব ; এটি প্রয়োজনO(log(n)) সময় যা 10 এর ক্ষমতার উপরে পুনরাবৃত্তি হওয়ার সমান।

এই সীমাবদ্ধতাটিতে আমার মনোনিবেশ আনার জন্য @ সিটিভোলকিল্যানিকে ধন্যবাদ জানাই। এটি আশ্চর্যজনক কীভাবে আপাতদৃষ্টিতে সঠিক সমাধানগুলি প্রয়োগের বিশদগুলিতে সতর্কতা অবলম্বন করে।


1
রেঞ্জের বাইরে n থাকলে এটি কাজ করে না [-99999999999999997, 999999999999997]
PADYMKO

@ শেটিভোলকিল্যানি, আমি পাইথন 2.7 এবং 3.5 এর জন্য 50 ডিজিট পর্যন্ত এটি পরীক্ষা করেছি। শুধু একটি assert list(range(1,51)) == [math.floor(math.log10(n))+1 for n in (10**e for e in range(50))]
বিজিওয়ান

2
পাইথন 2.7 বা পাইথন 3.5 দিয়ে এটি ব্যবহার করে দেখুন >>> math.floor(math.log10(999999999999997))+1 15.0 >>> math.floor(math.log10(999999999999998))+1 16.0। আমার উত্তর দেখুন stackoverflow.com/a/42736085/6003870
PADYMKO

12

ঠিক আছে, স্ট্রিংয়ে রূপান্তর না করে আমি এমন কিছু করব:

def lenDigits(x): 
    """
    Assumes int(x)
    """

    x = abs(x)

    if x < 10:
        return 1

    return 1 + lenDigits(x / 10)

মিনিমালিস্ট পুনরাবৃত্তি FTW


1
আপনি প্রচুর সংখ্যার জন্য পুনরাবৃত্তি সীমাতে পৌঁছে যাবেন।
nog642

9

সংখ্যাকে ডাব্লু / ও এর সংখ্যাকে একটি স্ট্রিংয়ে রূপান্তর করুন:

x=123
x=abs(x)
i = 0
while x >= 10**i:
    i +=1
# i is the number of digits

ভাল এক স্ট্রিং রূপান্তর সম্পূর্ণরূপে এড়ানো।
প্যাট্রিক মুটুকু

7

প্রিয় ব্যবহারকারী @ ক্যালভিন্টউউর হিসাবে উল্লিখিত হিসাবে, ফাংশনটির math.log10[-99999999999999997, 999999999999997]] এর বাইরে কিছু সংখ্যক ক্ষেত্রে সমস্যা রয়েছে, যেখানে আমরা ভাসমান পয়েন্ট ত্রুটি পাই। আমি জাভাস্ক্রিপ্ট (গুগল ভি 8 এবং নোডজেএস) এবং সি (জিএনইউ জিসিসি সংকলক) নিয়ে এই সমস্যাটি পেয়েছিলাম, সুতরাং 'purely mathematically'এখানে একটি সমাধান অসম্ভব।


এই উপর ভিত্তি করে সারকথা এবং উত্তর দুর্মূল্য ব্যবহারকারী @Calvintwr

import math


def get_count_digits(number: int):
    """Return number of digits in a number."""

    if number == 0:
        return 1

    number = abs(number)

    if number <= 999999999999997:
        return math.floor(math.log10(number)) + 1

    count = 0
    while number:
        count += 1
        number //= 10
    return count

আমি 20 (সমেত) পর্যন্ত দৈর্ঘ্যের সংখ্যায় এটি পরীক্ষা করেছি এবং ঠিক আছে। এটি অবশ্যই পর্যাপ্ত হতে হবে, কারণ 64-বিট সিস্টেমে দৈর্ঘ্য সর্বাধিক পূর্ণসংখ্যার সংখ্যা 19 ( len(str(sys.maxsize)) == 19)।

assert get_count_digits(-99999999999999999999) == 20
assert get_count_digits(-10000000000000000000) == 20
assert get_count_digits(-9999999999999999999) == 19
assert get_count_digits(-1000000000000000000) == 19
assert get_count_digits(-999999999999999999) == 18
assert get_count_digits(-100000000000000000) == 18
assert get_count_digits(-99999999999999999) == 17
assert get_count_digits(-10000000000000000) == 17
assert get_count_digits(-9999999999999999) == 16
assert get_count_digits(-1000000000000000) == 16
assert get_count_digits(-999999999999999) == 15
assert get_count_digits(-100000000000000) == 15
assert get_count_digits(-99999999999999) == 14
assert get_count_digits(-10000000000000) == 14
assert get_count_digits(-9999999999999) == 13
assert get_count_digits(-1000000000000) == 13
assert get_count_digits(-999999999999) == 12
assert get_count_digits(-100000000000) == 12
assert get_count_digits(-99999999999) == 11
assert get_count_digits(-10000000000) == 11
assert get_count_digits(-9999999999) == 10
assert get_count_digits(-1000000000) == 10
assert get_count_digits(-999999999) == 9
assert get_count_digits(-100000000) == 9
assert get_count_digits(-99999999) == 8
assert get_count_digits(-10000000) == 8
assert get_count_digits(-9999999) == 7
assert get_count_digits(-1000000) == 7
assert get_count_digits(-999999) == 6
assert get_count_digits(-100000) == 6
assert get_count_digits(-99999) == 5
assert get_count_digits(-10000) == 5
assert get_count_digits(-9999) == 4
assert get_count_digits(-1000) == 4
assert get_count_digits(-999) == 3
assert get_count_digits(-100) == 3
assert get_count_digits(-99) == 2
assert get_count_digits(-10) == 2
assert get_count_digits(-9) == 1
assert get_count_digits(-1) == 1
assert get_count_digits(0) == 1
assert get_count_digits(1) == 1
assert get_count_digits(9) == 1
assert get_count_digits(10) == 2
assert get_count_digits(99) == 2
assert get_count_digits(100) == 3
assert get_count_digits(999) == 3
assert get_count_digits(1000) == 4
assert get_count_digits(9999) == 4
assert get_count_digits(10000) == 5
assert get_count_digits(99999) == 5
assert get_count_digits(100000) == 6
assert get_count_digits(999999) == 6
assert get_count_digits(1000000) == 7
assert get_count_digits(9999999) == 7
assert get_count_digits(10000000) == 8
assert get_count_digits(99999999) == 8
assert get_count_digits(100000000) == 9
assert get_count_digits(999999999) == 9
assert get_count_digits(1000000000) == 10
assert get_count_digits(9999999999) == 10
assert get_count_digits(10000000000) == 11
assert get_count_digits(99999999999) == 11
assert get_count_digits(100000000000) == 12
assert get_count_digits(999999999999) == 12
assert get_count_digits(1000000000000) == 13
assert get_count_digits(9999999999999) == 13
assert get_count_digits(10000000000000) == 14
assert get_count_digits(99999999999999) == 14
assert get_count_digits(100000000000000) == 15
assert get_count_digits(999999999999999) == 15
assert get_count_digits(1000000000000000) == 16
assert get_count_digits(9999999999999999) == 16
assert get_count_digits(10000000000000000) == 17
assert get_count_digits(99999999999999999) == 17
assert get_count_digits(100000000000000000) == 18
assert get_count_digits(999999999999999999) == 18
assert get_count_digits(1000000000000000000) == 19
assert get_count_digits(9999999999999999999) == 19
assert get_count_digits(10000000000000000000) == 20
assert get_count_digits(99999999999999999999) == 20

পাইথন 3.5 এর সাথে পরীক্ষিত কোডগুলির সমস্ত উদাহরণ


3

উত্তরোত্তর জন্য, এই সমস্যার দীর্ঘতমতম সমাধান নিঃসন্দেহে:

def num_digits(num, number_of_calls=1):
    "Returns the number of digits of an integer num."
    if num == 0 or num == -1:
        return 1 if number_of_calls == 1 else 0
    else:
        return 1 + num_digits(num/10, number_of_calls+1)


1

ধরে নেওয়া যাক যে আপনি সবচেয়ে বড় সংখ্যার জন্য জিজ্ঞাসা করছেন যা আপনি পূর্ণসংখ্যায় সঞ্চয় করতে পারেন, মানটি বাস্তবায়ন নির্ভর। আমি পরামর্শ দিচ্ছি যে অজগরটি ব্যবহার করার সময় আপনি সেভাবে ভাবেন না। যাই হোক না কেন, বেশ বড় মান একটি অজগর 'পূর্ণসংখ্যায়' সংরক্ষণ করা যেতে পারে। মনে রাখবেন, পাইথন হাঁসের টাইপিং ব্যবহার করে!

সম্পাদনা: আমি স্পষ্টির আগে আমার উত্তর দিয়েছিলাম যে প্রশ্নকর্তা অঙ্কের সংখ্যা চান? তার জন্য, আমি গৃহীত উত্তর দ্বারা প্রস্তাবিত পদ্ধতির সাথে একমত। যোগ করার মতো আর কিছুই না!


1
def length(i):
  return len(str(i))

1

এটি ব্যবহার করে দ্রুত পূর্ণসংখ্যার জন্য করা যেতে পারে:

len(str(abs(1234567890)))

যা "1234567890" এর পরম মানের স্ট্রিংয়ের দৈর্ঘ্য পায়

absকোনও negativeণাত্মক (সংখ্যাটির মাত্রা) ছাড়াই নম্বরটি প্রদান করে, strএটিকে স্ট্রিং-এ রূপান্তর করে এবংlen স্ট্রিংয়ের দৈর্ঘ্য দেয়।

যদি আপনি এটি ভাসমানদের জন্য কাজ করতে চান তবে আপনি নিম্নলিখিত দুটি ব্যবহার করতে পারেন:

# Ignore all after decimal place
len(str(abs(0.1234567890)).split(".")[0])

# Ignore just the decimal place
len(str(abs(0.1234567890)))-1

ভবিষ্যতের রেফারেন্সের জন্য।


আমি মনে করি intএটির দশমিক স্ট্রিং প্রতিনিধিত্ব কেটে দেওয়ার চেয়ে ইনপুট নম্বরটি নিজেই কাটা (যেমন একটি কাস্ট সহ ) কেটে নেওয়া সহজ হবে : len(str(abs(int(0.1234567890))))1 টি রিটার্ন দেয়
ডেভিড ফোরস্টার

না, এটি কাজ করবে না। আপনি যদি 0.17টিকে পূর্ণসংখ্যায় পরিণত করেন তবে আপনি 0 পাবেন এবং এর দৈর্ঘ্য 0.17 দৈর্ঘ্যের থেকে আলাদা হবে
ফ্র্যাগবক্সে

প্রথম ক্ষেত্রে, স্ট্রিং প্রতিনিধিত্বের দশমিক পয়েন্ট থেকে সমস্ত কিছু ছিন্ন করে এবং আপনি সংখ্যার অবিচ্ছেদ্য অংশের দৈর্ঘ্য কার্যকরভাবে গণনা করছেন , যা আমার পরামর্শটিও তাই করে। 0.17 এর জন্য উভয় সমাধানই ফিরে আসে 1.
ডেভিড ফোস্টার

0

বৈজ্ঞানিক স্বরলিপিতে ফর্ম্যাট করুন এবং ঘাতককে তাড়িয়ে দিন:

int("{:.5e}".format(1000000).split("e")[1]) + 1

আমি গতি সম্পর্কে জানি না, তবে এটি সহজ।

দয়া করে নোট করুন দশমিকের পরে উল্লেখযোগ্য সংখ্যার সংখ্যা (".5e" "" 5 "" যদি এটি বৈজ্ঞানিক স্বরলিপিটির দশমিক অংশটিকে অন্য অঙ্কে সীমাবদ্ধ করে তোলে তবে এটি একটি ইস্যু হতে পারে I আপনি জানেন এমন বৃহত্তম সংখ্যার দৈর্ঘ্য।


0
def count_digit(number):
  if number >= 10:
    count = 2
  else:
    count = 1
  while number//10 > 9:
    count += 1
    number = number//10
  return count

এই কোডটি কীভাবে এবং কেন এই সমস্যার সমাধান করে তার ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে যদিও আপনার পোস্টের গুণমান উন্নত করতে সত্যই সহায়তা করবে এবং সম্ভবত আরও বেশি ভোটের ফলাফল হবে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, কেবল এখন যে ব্যক্তি জিজ্ঞাসা করছেন তা নয়। দয়া করে সম্পাদনা ব্যাখ্যা যোগ করতে পারেন এবং সীমাবদ্ধতা এবং অনুমানের কি প্রয়োগ একটি ইঙ্গিত দিতে আপনার উত্তর।
অ্যাড্রিয়ান মোল

0

যদি আপনাকে কোনও ব্যবহারকারীকে ইনপুট দিতে বলতে হয় এবং তারপরে আপনাকে কত নম্বর রয়েছে তা গণনা করতে হবে তবে আপনি এটি অনুসরণ করতে পারেন:

count_number = input('Please enter a number\t')

print(len(count_number))

দ্রষ্টব্য: ব্যবহারকারীর ইনপুট হিসাবে কখনই গ্রহণ করবেন না।


একটি প্রকৃত ক্ষেত্রে আপনি এখানে বর্ণনা করছেন কারণ এটি আসলে একটি স্ট্রিংয়ের দৈর্ঘ্যের সাথে সম্পর্কিত। এছাড়াও, আমি যে কোনও অ-সংখ্যাসূচক চরিত্রটি প্রবেশ করতে পারলাম এবং আপনি এখনও বিশ্বাস করবেন যে এটি একটি সংখ্যা।
বেন

0
def digits(n)
    count = 0
    if n == 0:
        return 1
    while (n >= 10**count):
        count += 1
        n += n%10
    return count
print(digits(25))   # Should print 2
print(digits(144))  # Should print 3
print(digits(1000)) # Should print 4
print(digits(0))    # Should print 1

0

এর জন্য আমার কোডটি নীচে রয়েছে; আমি লগ 10 পদ্ধতিটি ব্যবহার করেছি:

from math import *

ডিফ ডিজিট_কাউন্ট (সংখ্যা):

if number>1 and round(log10(number))>=log10(number) and number%10!=0 :
    return round(log10(number))
elif  number>1 and round(log10(number))<log10(number) and number%10!=0:
    return round(log10(number))+1
elif number%10==0 and number!=0:
    return int(log10(number)+1)
elif number==1 or number==0:
    return 1

আমাকে 1 এবং 0 এর ক্ষেত্রে উল্লেখ করতে হয়েছিল কারণ লগ 10 (1) = 0 এবং লগ 10 (0) = এনডি এবং সুতরাং উল্লিখিত শর্তটি সন্তুষ্ট নয়। তবে এই কোডটি কেবল পুরো সংখ্যার জন্যই কাজ করে।


0

এখানে একটি বিশাল কিন্তু দ্রুত সংস্করণ রয়েছে:

def nbdigit ( x ):
    if x >= 10000000000000000 : # 17 -
        return len( str( x ))
    if x < 100000000 : # 1 - 8
        if x < 10000 : # 1 - 4
            if x < 100             : return (x >= 10)+1 
            else                   : return (x >= 1000)+3
        else: # 5 - 8                                                 
            if x < 1000000         : return (x >= 100000)+5 
            else                   : return (x >= 10000000)+7
    else: # 9 - 16 
        if x < 1000000000000 : # 9 - 12
            if x < 10000000000     : return (x >= 1000000000)+9 
            else                   : return (x >= 100000000000)+11
        else: # 13 - 16
            if x < 100000000000000 : return (x >= 10000000000000)+13 
            else                   : return (x >= 1000000000000000)+15

খুব বেশি সংখ্যক নয় বলে কেবল 5 টি তুলনা। আমার কম্পিউটারে এটি math.log10সংস্করণ থেকে প্রায় 30% দ্রুত এবং len( str())একটির চেয়ে 5% দ্রুত । ঠিক আছে ... আপনি যদি উগ্রভাবে ব্যবহার না করেন তবে এত আকর্ষণীয় নয়।

এবং এখানে আমার ফাংশনটি পরীক্ষা / পরিমাপ করতে ব্যবহৃত সংখ্যার সেটটি দেওয়া হয়েছে:

n = [ int( (i+1)**( 17/7. )) for i in xrange( 1000000 )] + [0,10**16-1,10**16,10**16+1]

এনবি: এটি নেতিবাচক সংখ্যা পরিচালনা করে না, তবে অভিযোজন সহজ ...


-13
>>> a=12345
>>> a.__str__().__len__()
5

6
সরাসরি বিশেষ পদ্ধতিতে কল করবেন না। এটা লেখা আছে len(str(a))
মাইক গ্রাহাম

8
@ ঘোস্টডোগ 74৪ কেবলমাত্র বৈদ্যুতিক সকেট থাকার কারণে, এর অর্থ এই নয় যে আপনাকে নিজের আঙ্গুলগুলিতে এটি আটকাতে হবে।

3
সুতরাং আপনি যদি এর বিরুদ্ধে থাকেন তবে আপনি কেন এটি ব্যবহার করে ভুল করছেন তা আমাকে বলবেন না?
ghostdog74

11
"ম্যাজিক" __ পদ্ধতিগুলি রয়েছে পাইথন ইন্টারনালদের জন্য আবার কল করার জন্য, আপনার কোডটি সরাসরি কল করার জন্য নয়। এটি হলিউড ফ্রেমওয়ার্ক প্যাটার্ন: আমাদের কল করবেন না, আমরা আপনাকে কল করব। তবে এই কাঠামোর উদ্দেশ্যটি হ'ল স্ট্যান্ডার্ড পাইথন বিল্ট-ইনগুলি ব্যবহার করার জন্য এগুলি যাদু পদ্ধতিগুলি যাতে আপনার শ্রেণি অন্তর্নির্মিত আচরণটি কাস্টমাইজ করতে পারে। যদি আপনার কোডটি সরাসরি কল করার কোনও পদ্ধতি হয় তবে পদ্ধতিটিকে একটি অ - "__" নাম দিন। এটি স্পষ্টভাবে সেই পদ্ধতিগুলিকে পৃথক করে যা প্রোগ্রামার ব্যবহারের উদ্দেশ্যে, বনাম, পাইথন বিল্ট-ইনগুলি থেকে কলব্যাকের জন্য সরবরাহ করা।
PaulMcG

7
এটি খারাপ ধারণা কারণ পরিচিত মহাবিশ্বের প্রত্যেকেই স্ট্র () এবং লেন () ব্যবহার করে। এটি আলাদা হওয়ার স্বার্থে আলাদা হচ্ছে, যা অন্তর্নিহিত একটি খারাপ জিনিস - এটি কেবল নরক হিসাবে কুরুচিপূর্ণরূপে উল্লেখ করা উচিত নয়। -1।
গ্লেন মেইনার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.