কোনও সংখ্যার সমস্ত বিভাজন পাওয়ার সর্বোত্তম উপায় কী?


109

এখানে খুব বোবা উপায়:

def divisorGenerator(n):
    for i in xrange(1,n/2+1):
        if n%i == 0: yield i
    yield n

আমি যে ফলাফলটি পেতে চাই তা একইরকম, তবে আমি একটি স্মার্ট অ্যালগরিদম চাই (এটি অত্যন্ত ধীর এবং বোবা :-)

আমি প্রাথমিক কারণগুলি এবং তাদের বহুগুণ দ্রুত খুঁজে পেতে পারি। আমি একটি জেনারেটর রয়েছি যা এইভাবে ফ্যাক্টর উত্পন্ন করে:

(গুণক 1, গুণনক 1)
(গুণক 2, গুণক 2)
(গুণক 3, গুণন 3)
এবং আরও ...

অর্থাত্ আউটপুট

for i in factorGenerator(100):
    print i

হ'ল:

(2, 2)
(5, 2)

আমি যা করতে চাই তার জন্য এটি কতটা দরকারী তা আমি জানি না (আমি অন্যান্য সমস্যার জন্য কোড করেছিলাম) যাইহোক, আমি বুদ্ধিমানভাবে তৈরি করার উপায় চাই

for i in divisorGen(100):
    print i

এটি আউটপুট:

1
2
4
5
10
20
25
50
100

আপডেট: গ্রেগ হিউগিল এবং তার "স্মার্ট ওয়ে" কে অনেক ধন্যবাদ :) 100000000 এর সমস্ত বিভাজক গণনা করা 391 দশকের বিপরীতে তার পথের সাথে 0.01 সেকেন্ড নিয়েছিল যে মাইন্ডটি খুব শীতল করেছে: ডি

আপডেট 2: এটি এই পোস্টের সদৃশ বলে বলা বন্ধ করুন । প্রদত্ত সংখ্যার বিভাজকের সংখ্যা গণনা করার জন্য সমস্ত বিভাজক গণনা করার দরকার নেই। এটি অন্যরকম সমস্যা, আপনি যদি ভাবেন যে এটি না হয় তবে উইকিপিডিয়ায় "ডিভায়ার ফাংশন" সন্ধান করুন। পোস্ট করার আগে প্রশ্ন এবং উত্তরটি পড়ুন, আপনি যদি বিষয়টি বুঝতে না পারেন তবে কেবল দরকারী এবং ইতিমধ্যে প্রদত্ত উত্তরগুলি যুক্ত করবেন না।


যে কারণে এটি প্রস্তাবিত হয়েছিল যে এই প্রশ্নটি "প্রদত্ত সংখ্যার বিভাজক সংখ্যা গণনা করার জন্য অ্যালগরিদম" এর প্রায় সদৃশ ছিল সে প্রশ্নটির প্রস্তাবিত প্রথম পদক্ষেপটি ছিল বিভক্তদের সমস্ত সন্ধান করা , যা আমি বিশ্বাস করি ঠিক তুমি কি করার চেষ্টা করছ?
অ্যান্ড্রু এডজকমবে

4
অ্যান্ড্রু সেখানে কতগুলি বিভাজন রয়েছে তা সন্ধান করার জন্য আপনাকে কেবল প্রধান কারণগুলি সন্ধান করতে হবে এবং তারপরে সেখানে কত বিভাজন হতে পারে তা গণনা করতে তাদের ব্যবহার করুন। সেক্ষেত্রে বিভাজনকারীদের সন্ধানের প্রয়োজন নেই।
Loïc Faure-Lacroix

4
@ আন্দ্রেআ আম্বু, দয়া করে আপনার ফাংশনটির নামগুলি সংশোধন করুন
খনিজগুলি

উত্তর:


77

আপনার factorGeneratorফাংশন দেওয়া , এখানে divisorGenকাজ করা উচিত:

def divisorGen(n):
    factors = list(factorGenerator(n))
    nfactors = len(factors)
    f = [0] * nfactors
    while True:
        yield reduce(lambda x, y: x*y, [factors[x][0]**f[x] for x in range(nfactors)], 1)
        i = 0
        while True:
            f[i] += 1
            if f[i] <= factors[i][1]:
                break
            f[i] = 0
            i += 1
            if i >= nfactors:
                return

এই অ্যালগরিদমের সামগ্রিক দক্ষতা সম্পূর্ণরূপে দক্ষতার উপর নির্ভর করবে factorGenerator


4
বাহ 3900 এর দশকের বিপরীতে 100000000 এর সমস্ত বিভাজক গণনা করার জন্য এটি 0.01 কে নিয়েছিল যা খুব শীতল হয়ে গেছে (এন / 2 এ থামছে), আপনাকে ধন্যবাদ!
Andrea অম্বু

47
আমাদের মধ্যে যারা পাইথোনিস বোঝেন না, তারা আসলে এটি কী করছে?
ম্যাথু Scharley

4
মনোক্সাইড: এটি প্রদত্ত কারণগুলির সমস্ত গুণিত সংমিশ্রণগুলি গণনা করে। এর বেশিরভাগটি স্ব-ব্যাখ্যামূলক হওয়া উচিত; "ফলন" রেখাটি একটি রিটার্নের মতো তবে মান ফেরত দেওয়ার পরেও চালিয়ে যায়। [0] * এনফ্যাক্টর দৈর্ঘ্যের এনফ্যাক্টরের জিরোগুলির একটি তালিকা তৈরি করে। হ্রাস (...) গুণনীয়কগুলির গুণাগুণ গণনা করে।
গ্রেগ হিউগিল

হ্রাস এবং ল্যাম্বদা স্বরলিপিটি সেই অংশগুলি ছিল যা আমাকে আসলে বিভ্রান্ত করেছিল। আমি সি # তে এটি করার জন্য একটি অ্যালগরিদম বাস্তবায়নের চেষ্টা করেছি কারণগুলির অ্যারে চলার জন্য একটি পুনরাবৃত্ত ফাংশন ব্যবহার করে এবং
সমস্তগুলি

4
এটি অবশ্যই n / 2 বা এমনকি sqrt (n) পর্যন্ত প্রতিটি সংখ্যাকে বিভক্ত করার চেয়ে নাটকীয়ভাবে ভাল, তবে এই বিশেষ প্রয়োগের দুটি ত্রুটি রয়েছে: বেশ কার্যকর, অকার্যকর: বার বার একই শক্তিগুলি গুণ করা ইত্যাদি। পাইথোনিক দেখায়, তবে আমি মনে করি না পাইথন হ'ল পারফরম্যান্স সম্পর্কে। সমস্যা দুটি: বিভাজকগুলি যথাযথভাবে ফিরে আসে না।
টমসজ গ্যান্ডার

34

শিমি যা বলেছে তার প্রসারিত করতে আপনার লুপটি 1 থেকে n এর বর্গমূলের দিকে চালানো উচিত। তারপরে এই জুটিটি অনুসন্ধান করতে, করুন n / i, এবং এটি পুরো সমস্যার জায়গাগুলি .েকে দেবে।

যেমনটি উল্লেখ করা হয়েছিল, এটি একটি এনপি, বা 'কঠিন' সমস্যা। ক্লান্তিকর অনুসন্ধান, আপনি যেভাবে এটি করছেন, গ্যারান্টিযুক্ত উত্তরের জন্য এটি ততটা দুর্দান্ত। এই সত্যটি এনক্রিপশন অ্যালগরিদমগুলি এবং এগুলি সুরক্ষিত করতে সহায়তা করতে ব্যবহার করে। যদি কেউ এই সমস্যাটি সমাধান করেন তবে বেশিরভাগ ক্ষেত্রে যদি আমাদের বর্তমান 'সুরক্ষিত' যোগাযোগ ব্যবস্থা নিরাপদ না হয়।

পাইথন কোড:

import math

def divisorGenerator(n):
    large_divisors = []
    for i in xrange(1, int(math.sqrt(n) + 1)):
        if n % i == 0:
            yield i
            if i*i != n:
                large_divisors.append(n / i)
    for divisor in reversed(large_divisors):
        yield divisor

print list(divisorGenerator(100))

যার ফলে একটি তালিকা আউটপুট করা উচিত:

[1, 2, 4, 5, 10, 20, 25, 50, 100]

4
কারণ, একবার আপনার সাথে 1..10 এর মধ্যে একটি উপাদানের তালিকা থাকলে আপনি ১১.১০০ এর মধ্যে তুচ্ছতার মধ্যে কোনও উপাদান তৈরি করতে পারেন। আপনি {1, 2, 4, 5, 10} পান} এই উপাদানগুলির প্রতিটি দ্বারা 100 ভাগ করুন এবং আপনি {100, 50, 20, 25, 10}}
ম্যাথু শার্লে

4
সংজ্ঞা দ্বারা গুণকগুলি সবসময় জোড়া তৈরি হয়। কেবল
স্কয়ার্ট

এটি আমার পোস্টের সংস্করণটির চেয়ে খুব দ্রুত, তবে এটি মূল কারণগুলি ব্যবহার করে সংস্করণটির তুলনায় খুব ধীরে
Andrea Ambu

আমি সম্মত এটি সেরা সমাধান নয়। আমি কেবল 'বোবা' অনুসন্ধানের 'আরও ভাল' পদ্ধতির দিকে ইঙ্গিত করছিলাম যা ইতিমধ্যে প্রচুর সময় সাশ্রয় করবে।
ম্যাথু শার্লে

কারখানাটিকে এনপি-হার্ড হিসাবে দেখানো হয়নি not en.wikedia.org/wiki/Integer_factorization এবং মুখ্য কারণগুলি (হার্ড অংশ) ইতিমধ্যে খুঁজে পাওয়া গিয়েছিল এমন সমস্যাটি প্রদান করে সমস্ত বিভাজনকারীকে খুঁজে পাওয়া।
জেমি

19

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

এটা হল:

  • পাঠযোগ্য
  • সংক্ষিপ্ত
  • স্ব অন্তর্ভুক্ত, অনুলিপি এবং পেস্ট প্রস্তুত
  • দ্রুত (অনেকগুলি মূল কারণ এবং বিভাজক ক্ষেত্রে,> গৃহীত সমাধানের চেয়ে 10 গুণ বেশি দ্রুত)
  • পাইথন 3, পাইথন 2 এবং পাইপির সাথে সঙ্গতিপূর্ণ

কোড:

def divisors(n):
    # get factors and their counts
    factors = {}
    nn = n
    i = 2
    while i*i <= nn:
        while nn % i == 0:
            factors[i] = factors.get(i, 0) + 1
            nn //= i
        i += 1
    if nn > 1:
        factors[nn] = factors.get(nn, 0) + 1

    primes = list(factors.keys())

    # generates factors from primes[k:] subset
    def generate(k):
        if k == len(primes):
            yield 1
        else:
            rest = generate(k+1)
            prime = primes[k]
            for factor in rest:
                prime_to_i = 1
                # prime_to_i iterates prime**i values, i being all possible exponents
                for _ in range(factors[prime] + 1):
                    yield factor * prime_to_i
                    prime_to_i *= prime

    # in python3, `yield from generate(0)` would also work
    for factor in generate(0):
        yield factor

আমি প্রতিস্থাপন করবে while i*i <= nnদ্বারা while i <= limit, যেখানেlimit = math.sqrt(n)
Rafa0809

17

আমি মনে করি আপনি math.sqrt(n)এন / 2 এর পরিবর্তে থামতে পারেন ।

আমি আপনাকে উদাহরণ দেব যাতে আপনি এটি সহজে বুঝতে পারেন। এখন sqrt(28)হয় 5.29তাই ceil(5.29)হতে হবে 6. তাই আমি যদি আমি 6 থামবে তারপর আমি সব ভাজক পেতে পারেন হবে। কীভাবে?

প্রথমে কোডটি দেখুন এবং তারপরে চিত্রটি দেখুন:

import math
def divisors(n):
    divs = [1]
    for i in xrange(2,int(math.sqrt(n))+1):
        if n%i == 0:
            divs.extend([i,n/i])
    divs.extend([n])
    return list(set(divs))

এখন, নীচের চিত্রটি দেখুন:

যাক আমি ইতিমধ্যে যুক্ত করেছেন 1আমার ভাজক লিস্টে আমি দিয়ে শুরু i=2তাই

একটি 28 এর বিভাজন

সুতরাং সমস্ত পুনরাবৃত্তির শেষে যেমন আমি আমার তালিকায় ভাগফল এবং বিভাজক যুক্ত করেছি 28 এর সমস্ত বিভাজন জনবহুল।

উত্স: কোনও সংখ্যার বিভাজক কীভাবে নির্ধারণ করবেন


4
সুন্দর সুন্দর!! math.sqrt(n) instead of n/2কমনীয়তার জন্য বাধ্যতামূলক
রাফা0809

এটি ভুল। আপনি ভুলে গেছেন এন নিজেই বিভাজ্য।
জেসনলনহার্ড

4
চমৎকার উত্তর. সহজ এবং পরিষ্কার। তবে পাইথন 3 এর জন্য 2 টি প্রয়োজনীয় পরিবর্তন রয়েছে: এন / i টাইপ করা উচিত ইনট (এন / আই) এর কারণে এন / আই ফ্ল্যাট নম্বর তৈরি করে। এছাড়াও রেঞ্জেক্স অজগর 3 এ অবমূল্যায়ন করা হয়েছে এবং এটি পরিসীমা দ্বারা প্রতিস্থাপিত হয়েছে।
জিওফ্রয় CALA

7

আমি গ্রেগ দ্রবণ পছন্দ করি, তবে আমি আশা করি এটি আরও অজগর মতো। আমি মনে করি এটি দ্রুত এবং আরও পাঠযোগ্য হবে; কোডিংয়ের কিছু সময় পরে আমি এই সাথে বেরিয়ে এসেছি।

কার্টেসিয়ান তালিকাগুলি তৈরি করতে প্রথম দুটি ফাংশন প্রয়োজন। এবং এই সমস্যাটি যেখানেই দেখা দেয় তার পুনরায় ব্যবহার করা যেতে পারে। যাইহোক, আমি নিজেই এটিকে প্রোগ্রাম করেছিলাম, যদি কেউ এই সমস্যার কোনও মানক সমাধানের কথা জানেন তবে দয়া করে বিনা দ্বিধায় আমার সাথে যোগাযোগ করুন।

"ফ্যাক্টজোরনেটর" এখন একটি অভিধান প্রদান করে। এবং তারপরে অভিধানটি "বিভাগকারী" হিসাবে খাওয়ানো হয়েছে, যিনি এটি প্রথমে তালিকার একটি তালিকা তৈরি করতে ব্যবহার করেন, যেখানে প্রতিটি তালিকা পি প্রাইম সহ পি p n ফর্মের কারণগুলির তালিকা। তারপরে আমরা সেই তালিকাগুলির কার্টেসিয়ান পণ্য তৈরি করি এবং অবশেষে বিভাজক তৈরির জন্য গ্রেগের সমাধানটি ব্যবহার করি। আমরা তাদের বাছাই এবং তাদের ফিরে।

আমি এটি পরীক্ষা করেছি এবং এটি আগের সংস্করণটির থেকে কিছুটা দ্রুত গতিতে বলে মনে হচ্ছে। আমি এটি আরও বড় প্রোগ্রামের অংশ হিসাবে পরীক্ষা করেছি, তাই এটি তত দ্রুত হলেও আমি সত্যিই বলতে পারি না।

পিট্রো স্পেরোনি (পাইট্রোস্পেরনি ডট এটি)

from math import sqrt


##############################################################
### cartesian product of lists ##################################
##############################################################

def appendEs2Sequences(sequences,es):
    result=[]
    if not sequences:
        for e in es:
            result.append([e])
    else:
        for e in es:
            result+=[seq+[e] for seq in sequences]
    return result


def cartesianproduct(lists):
    """
    given a list of lists,
    returns all the possible combinations taking one element from each list
    The list does not have to be of equal length
    """
    return reduce(appendEs2Sequences,lists,[])

##############################################################
### prime factors of a natural ##################################
##############################################################

def primefactors(n):
    '''lists prime factors, from greatest to smallest'''  
    i = 2
    while i<=sqrt(n):
        if n%i==0:
            l = primefactors(n/i)
            l.append(i)
            return l
        i+=1
    return [n]      # n is prime


##############################################################
### factorization of a natural ##################################
##############################################################

def factorGenerator(n):
    p = primefactors(n)
    factors={}
    for p1 in p:
        try:
            factors[p1]+=1
        except KeyError:
            factors[p1]=1
    return factors

def divisors(n):
    factors = factorGenerator(n)
    divisors=[]
    listexponents=[map(lambda x:k**x,range(0,factors[k]+1)) for k in factors.keys()]
    listfactors=cartesianproduct(listexponents)
    for f in listfactors:
        divisors.append(reduce(lambda x, y: x*y, f, 1))
    divisors.sort()
    return divisors



print divisors(60668796879)

পিএস এটি প্রথমবারের মতো আমি স্ট্যাকওভারফ্লোতে পোস্ট করছি। আমি কোন প্রতিক্রিয়া জন্য অপেক্ষা করছি।


পাইথন ২.6-তে একটি ইটার্টোলস রয়েছে odu প্রোডাক্ট ()।
jfs

তালিকার পরিবর্তে জেনারেটর ব্যবহার করে এমন একটি সংস্করণ everywhere
jfs

এরাটোস্থেনিস এর চালনী কম তারপর মৌলিক সংখ্যার জেনারেট করতে বা সমান বর্গমূল (ঢ) ব্যবহার করা যেতে পারে stackoverflow.com/questions/188425/project-euler-problem#193605
JFS

4
কোডিং শৈলী: এক্সটেনশন = [কে ** এক্স এর জন্য, ফ্যাক্টর.এইটেমের জন্য ভি () এক্সের জন্য রেঞ্জের (v + 1)]
জেফস

লিসটপোপোসেন্টসের জন্য: [[কে ** এক্স এক্স রেঞ্জের জন্য (v + 1)] কে, ফ্যাক্টর.ইটিমে ()]
ক্লেনওয়েল

3

খাঁটি পাইথন ৩. in-তে প্রায় 10 ** 16 পর্যন্ত সংখ্যার জন্য এটি করার একটি স্মার্ট এবং দ্রুত উপায়,

from itertools import compress

def primes(n):
    """ Returns  a list of primes < n for n > 2 """
    sieve = bytearray([True]) * (n//2)
    for i in range(3,int(n**0.5)+1,2):
        if sieve[i//2]:
            sieve[i*i//2::i] = bytearray((n-i*i-1)//(2*i)+1)
    return [2,*compress(range(3,n,2), sieve[1:])]

def factorization(n):
    """ Returns a list of the prime factorization of n """
    pf = []
    for p in primeslist:
      if p*p > n : break
      count = 0
      while not n % p:
        n //= p
        count += 1
      if count > 0: pf.append((p, count))
    if n > 1: pf.append((n, 1))
    return pf

def divisors(n):
    """ Returns an unsorted list of the divisors of n """
    divs = [1]
    for p, e in factorization(n):
        divs += [x*p**k for k in range(1,e+1) for x in divs]
    return divs

n = 600851475143
primeslist = primes(int(n**0.5)+1) 
print(divisors(n))

প্রাইমগুলি খুঁজে পেতে এবং গুণনীয় করতে অ্যালগরিদমের নাম কী? কারণ আমি এটি সি # তে প্রয়োগ করতে চাই
কিয়ু

3

আমি কেবল ভবিষ্যতের রেফারেন্সের জন্য আনিভার্থের (যেহেতু আমি এটি সবচেয়ে পাইথোনিক হিসাবে বিশ্বাস করি) এর কিছুটা সংশোধিত সংস্করণ যুক্ত করতে যাচ্ছি।

from math import sqrt

def divisors(n):
    divs = {1,n}
    for i in range(2,int(sqrt(n))+1):
        if n%i == 0:
            divs.update((i,n//i))
    return divs

2

কোডআরভিউ থেকে গৃহীত , এখানে একটি রূপ রয়েছে যা এর সাথে কাজ করে num=1!

from itertools import product
import operator

def prod(ls):
   return reduce(operator.mul, ls, 1)

def powered(factors, powers):
   return prod(f**p for (f,p) in zip(factors, powers))


def divisors(num) :

   pf = dict(prime_factors(num))
   primes = pf.keys()
   #For each prime, possible exponents
   exponents = [range(i+1) for i in pf.values()]
   return (powered(primes,es) for es in product(*exponents))

4
আমি একজন ত্রুটি পেয়ে হবে বলে মনে হচ্ছে: NameError: global name 'prime_factors' is not defined। অন্যান্য উত্তরগুলির কোনোটাই বা মূল প্রশ্নটি কোনওটিই এটি সংজ্ঞায়িত করে না।
আনানফায়

1

পুরানো প্রশ্ন, তবে এখানে আমার গ্রহণ:

def divs(n, m):
    if m == 1: return [1]
    if n % m == 0: return [m] + divs(n, m - 1)
    return divs(n, m - 1)

আপনি এর সাথে প্রক্সি করতে পারেন:

def divisorGenerator(n):
    for x in reversed(divs(n, n)):
        yield x

দ্রষ্টব্য: যে ভাষাগুলি সমর্থন করে তাদের জন্য এটি পুনরুক্তি হতে পারে।


0

ধরে নিই যে factorsফাংশনটি n এর উপাদানগুলি ফেরৎ দেয় (উদাহরণস্বরূপ, factors(60)[2, 2, 3, 5] তালিকাটি ফেরত দেয়), এখানে n এর বিভাজনগুলি গণনা করার জন্য একটি ফাংশন রয়েছে :

function divisors(n)
    divs := [1]
    for fact in factors(n)
        temp := []
        for div in divs
            if fact * div not in divs
                append fact * div to temp
        divs := divs + temp
    return divs

অজগর কি? যাইহোক, এটি অবশ্যই অজগর 3.x নয়।
জিনকিন

এটি সিউডোকোড, যা অজগর থেকে অনুবাদ করা সহজ হওয়া উচিত।
ব্যবহারকারী 448810

3 বছর দেরী, কখনও না এর চেয়ে বেশি দেরী :) আইএমও, এটি করার জন্য এটি সবচেয়ে সহজ, সংক্ষিপ্ততম কোড। আমার তুলনা টেবিল নেই, তবে আমি আমার আই 5 বহনযোগ্য ল্যাপটপে 1 মিলিয়ন মিলিয়ন পর্যন্ত বিভাজকগুলিকে গুণিত করতে এবং গুণতে পারি।
রিয়াজ মনসুর

0

এখানে আমার সমাধান। এটি বোবা বলে মনে হচ্ছে তবে ভাল কাজ করে ... এবং আমি সমস্ত সঠিক বিভাজনকারী খুঁজতে চেষ্টা করছিলাম যাতে লুপটি i = 2 থেকে শুরু হয়েছিল।

import math as m 

def findfac(n):
    faclist = [1]
    for i in range(2, int(m.sqrt(n) + 2)):
        if n%i == 0:
            if i not in faclist:
                faclist.append(i)
                if n/i not in faclist:
                    faclist.append(n/i)
    return facts

টাইপো: রিটার্ন ফ্যাক্টস => ফ্যাক্টলিস্ট
জোনাথ পি

0

যদি আপনি কেবল তালিকা বোধগম্যতা এবং অন্য কিছু আপনার জন্য গুরুত্বপূর্ণ ব্যবহার করে না তবে যত্নশীল!

from itertools import combinations
from functools import reduce

def get_devisors(n):
    f = [f for f,e in list(factorGenerator(n)) for i in range(e)]
    fc = [x for l in range(len(f)+1) for x in combinations(f, l)]
    devisors = [1 if c==() else reduce((lambda x, y: x * y), c) for c in set(fc)]
    return sorted(devisors)

0

আপনার পিসিতে যদি প্রচুর পরিমাণে মেমরি থাকে তবে একটি ব্রুট সিঙ্গল লাইন নম্পতির সাথে দ্রুত পর্যাপ্ত হতে পারে:

N = 10000000; tst = np.arange(1, N); tst[np.mod(N, tst) == 0]
Out: 
array([      1,       2,       4,       5,       8,      10,      16,
            20,      25,      32,      40,      50,      64,      80,
           100,     125,     128,     160,     200,     250,     320,
           400,     500,     625,     640,     800,    1000,    1250,
          1600,    2000,    2500,    3125,    3200,    4000,    5000,
          6250,    8000,   10000,   12500,   15625,   16000,   20000,
         25000,   31250,   40000,   50000,   62500,   78125,   80000,
        100000,  125000,  156250,  200000,  250000,  312500,  400000,
        500000,  625000, 1000000, 1250000, 2000000, 2500000, 5000000])

আমার ধীর পিসিতে 1 এস এরও কম সময় নেয়।


0

জেনারেটর ফাংশনের মাধ্যমে আমার সমাধানটি হ'ল:

def divisor(num):
    for x in range(1, num + 1):
        if num % x == 0:
            yield x
    while True:
        yield None

-1
return [x for x in range(n+1) if n/x==int(n/x)]

4
প্রশ্নকারী কেবল একটি সুন্দর বিন্যাস নয়, আরও ভাল অ্যালগরিদম চেয়েছিলেন।
Veedrac

4
শূন্য দ্বারা বিভাজন এড়াতে আপনার পরিসর (1, n + 1) ব্যবহার করতে হবে এছাড়াও, পাইথন ২.7 ব্যবহার করে আপনাকে প্রথম বিভাগের জন্য ফ্লোট (এন) ব্যবহার করতে হবে, এখানে 1/2 = 0
জেনস মুঙ্ক

-1

আমার জন্য এটি ভাল কাজ করে এবং এটি পরিষ্কারও রয়েছে (পাইথন 3)

def divisors(number):
    n = 1
    while(n<number):
        if(number%n==0):
            print(n)
        else:
            pass
        n += 1
    print(number)

খুব দ্রুত নয় তবে আপনি যেমন চান ঠিক তেমন লাইন দিয়ে বিভাজনগুলি লাইন করে দেন, এছাড়াও আপনি যদি সত্যিই চান তবে আপনি list.append (n) এবং list.append (নম্বর) করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.