Проверка основного числа Python [дубликаты]

Каждая приостановляемая функция имеет доступ к глобальной переменной coroutineContext, которую вы можете тривиально обернуть в CoroutineScope, но это не ее целевое назначение. Это там, так что вы можете в любой момент проверить, была ли отменена ваша сопрограмма, получить отладочную информацию, такую ​​как имя задания и т. Д.

По словам Романа Елизарова в его недавнем Medium post :

suspend fun doNotDoThis() {
    CoroutineScope(coroutineContext).launch {
        println("I'm confused")
    }
}

Не делайте этого!

blockquote>

Приостановленная функция не должна запускать параллельную работу, которая может продолжаться после ее возврата. Он должен использовать только параллелизм для достижения параллельной декомпозиции задачи, а это значит, что он будет ждать завершения всех дочерних сопрограмм.

Вы должны решить либо использовать простую функцию, которая является получателем CoroutineScope (сигнализирующую о намерении начать параллельную работу) , либо использовать функцию приостановки, которая ожидает завершения всей работы, которую она инициировал.

Итак, если вы хотите параллельную декомпозицию, то используйте блок coroutineScope или, возможно, supervisorScope:

coroutineScope {
    launch { 
        // ... task to run in the background
    }
    // ... more work while the launched task runs in parallel
}
// All work done by the time we reach this line

coroutineScope является приостановленной функцией, и она не будет завершена, пока все сопрограммы были запущены полностью.

29
задан 10.04.2020, 11:32

14 ответов

Вам нужно прекратить итерации, если вы знаете, что число не простое. Добавьте break, как только найдете простое число, чтобы выйти из цикла while.

Внесение только минимальных изменений в ваш код, чтобы он работал:

a=2
num=13
while num > a :
  if num%a==0 & a!=num:
    print('not prime')
    break
  i += 1
else: # loop not exited via break
  print('prime')

Ваш алгоритм эквивалентен:

for a in range(a, num):
    if a % num == 0:
        print('not prime')
        break
else: # loop not exited via break
    print('prime')

Если вы добавите его в функцию, вы можете обойтись без break и for-else:

def is_prime(n):
    for i in range(3, n):
        if n % i == 0:
            return False
    return True

Даже если вы собираетесь использовать грубую силу для простого числа, вам нужно всего лишь пройти до квадратного корня из n. Также вы можете пропустить проверку четных чисел после двух.

С этими предложениями:

import math
def is_prime(n):
    if n % 2 == 0 and n > 2: 
        return False
    for i in range(3, int(math.sqrt(n)) + 1, 2):
        if n % i == 0:
            return False
    return True

Обратите внимание, что этот код неправильно обрабатывает 0, 1 и отрицательные числа.

Мы упростим это, используя all с выражением генератора для замены цикла for.

import math
def is_prime(n):
    if n % 2 == 0 and n > 2: 
        return False
    return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))
63
ответ дан 10.04.2020, 11:41
  • 1
    Да, мое последнее обновление использовало этот метод и было принято без выпусков Apple. – Mike 07.02.2020, 08:26
  • 2
    Этот метод работает, единственная проблема - когда я вставил 15 или 9, это говорит главный – Chris 10.04.2020, 11:41
  • 3
    Вы сначала пример не имеет никакого инкремента и неправильно сообщит главный для каждого нечетного числа и не главный для каждого даже. Ваше третье использование range(n), который запускается от 0, любой 0 и 1, поразило бы первое условие и выход False для каждого числа. – AChampion 10.04.2020, 11:42
  • 4
    Как я зафиксировал бы ошибку с созданием отчетов, главным на каждом нечетном и не главный для каждого даже? – Chris 10.04.2020, 11:42
  • 5
    @achampion: Обновленный. Спасибо за исправления. – Steven Rumbalski 10.04.2020, 11:43
def isprime(n):
    '''check if integer n is a prime'''

    # make sure n is a positive integer
    n = abs(int(n))

    # 0 and 1 are not primes
    if n < 2:
        return False

    # 2 is the only even prime number
    if n == 2: 
        return True    

    # all other even numbers are not primes
    if not n & 1: 
        return False

    # range starts with 3 and only needs to go up 
    # the square root of n for all odd numbers
    for x in range(3, int(n**0.5) + 1, 2):
        if n % x == 0:
            return False

    return True

Взято из:

http://www.daniweb.com/software-development/python/code/216880/check-if-a-number-is -a-простое число-питон

20
ответ дан 10.04.2020, 11:33
  • 1
    @davsan, да. В Xcode 4.5 Ваш проект создает против iOS 6.0 SDK, и можно добавить Сетчатку 4 изображения запуска. Xcode 4.4 будет создавать против iOS 5.1 SDK, но помнить, что это только для генерации armv6 двоичного файла. Все остальное в законченном комплекте приложений прибывает из Xcode 4.5. – Mike 07.02.2020, 08:26
  • 2
    +1 корневой квадратный верхний предел – Alberto Megía 10.04.2020, 11:33
  • 3
    Копии/вставке с внешнего источника (без любого вида курирования) нужно препятствовать. Кроме того, you' ре, не обсуждая OP' s код. – forivall 10.04.2020, 11:34
def is_prime(n):
    return all(n%j for j in xrange(2, int(n**0.5)+1)) and n>1
12
ответ дан 10.04.2020, 11:33
  • 1
    Для сборок отладки Вы могли бы хотеть использовать 'setenv ARMV6_EXECUTABLE_PATH " $BUILD_ROOT/$ {КОНФИГУРАЦИЯ} _armv6-iphoneos/$EXECUTABLE_PATH" и затем you' d должны повторить остальную часть шагов для отладки, то есть, создать конфигурацию Debug_armv6. – Piotr Kalinowski 07.02.2020, 08:27

После того, как вы определили, что число составное (а не простое), ваша работа завершена. Вы можете выйти из цикла с помощью break.

while num > a :
  if num%a==0 & a!=num:
    print('not prime')
    break          # not going to update a, going to quit instead
  else:
    print('prime')
    a=(num)+1

Кроме того, вы можете попытаться поближе познакомиться с некоторыми конструкциями в Python. Ваш цикл может быть сокращен до однострочного, который, на мой взгляд, хорошо читается.

any(num % a == 0 for a in range(2, num))
1
ответ дан 10.04.2020, 11:34
  • 1
    Фантастическая работа Kenji! Кажется, что Apple все еще идет на многое для создания наших жизней трудными. Просто примечание для других людей там: точками, перечисленными в 2-м файле для редактирования, являются Нулевые символы для меня (0x00) на XCode 4.5.2 – Brian 07.02.2020, 08:29

Это сделало бы работу:

number=int(raw_input("Enter a number to see if its prime:"))
if number <= 1:
    print "number is not prime"
else:
    a=2
    check = True
    while a != number:
        if number%a == 0:
            print "Number is not prime"
            check = False
            break
        a+=1
    if check == True:
        print "Number is prime" 
0
ответ дан 10.04.2020, 11:34
  • 1
    Еще одно примечание. Если you' ре с помощью Apple LVVM 4.2, you' ре, собирающееся должно установить " Неявно Objective C Ссылки Runtime" в " Apple компилятор LVVM 4.2 Language" разделите к " NO" иначе это попытается связать материал ARC который doesn' t, кажется, существуют в более старых armv6 версиях статических библиотек. – Brian 07.02.2020, 08:30

Две основные проблемы с вашим кодом:

  1. После обозначения числа не простым, вы продолжаете проверять остальные делители, даже если вы уже знаете, что оно не простое, что может привести к нему печать "премьер" после печати "не премьер". Подсказка: используйте оператор `break '.
  2. Вы назначаете простое число до того, как проверили все делители, которые нужно проверить, потому что вы печатаете «простое» внутри цикла. Таким образом, вы получаете «простое число» несколько раз, по одному разу для каждого делителя, который неравномерно входит в число тестируемых. Подсказка: используйте предложение else с циклом для печати «простого», только если цикл завершается без прерывания.

Пара довольно существенных недостатков:

  1. Вы должны отслеживать числа, которые вы уже нашли, которые являются простыми и делятся только на них. Зачем делить на 4, если вы уже поделили на 2? Если число делится на 4, оно также делится на 2, так что вы бы его уже поймали, и нет необходимости делить на 4.
  2. Вам нужно только проверить до квадратного корня из тестируемого числа, потому что любой фактор, больший, чем этот, должен быть умножен на число меньше этого, и это уже было бы проверено к тому времени, когда вы доберетесь до больше.
10
ответ дан 10.04.2020, 11:35
  • 1
    Этот " Это поддерживает armv6, armv7, и armv7s и версии iOS от 4,2 до 6.0." isn' t действительно верный, правильно? Это doesn' t поддерживают 4.2 на armv7 (или amrv7s), так как это было сборкой с iOS 6 SDK, который может только предназначаться 4.3 как минимум. Я понимаю, что, вероятно, существует not' t многие люди с armv7 устройствами, все еще работающими 4.2, но I' m удивил ту Apple, готово принять сборку как это. Как они передают это, это поддерживает одну минимальную ОС на некоторых устройствах и различную минимальную ОС на различных устройствах? Или разве они просто не заботятся? – honus 07.02.2020, 08:27

Ваша проблема в том, что цикл продолжает работать, даже если вы уже «решили». Вы должны добавить строку break после a=a+1

2
ответ дан 10.04.2020, 11:36
  • 1
    Упорно продолженный lipo управляют частью... У меня все еще есть ошибка в XCode при компиляции.. – Alby 07.02.2020, 08:29

Здесь новичок, поэтому, пожалуйста, дайте мне знать, если я в порядке, но я бы сделал это так:

def prime(n):
    count = 0
    for i in range(1, (n+1)): 
         if n % i == 0: 
             count += 1
    if count > 2:
        print "Not a prime"
    else:
        print "A prime"
2
ответ дан 10.04.2020, 11:36
  • 1
    Заставил это работать! Вы - гений! – Alby 07.02.2020, 08:29

Этот пример - использовать Reduce (), но замедляет его:

def makepnl(pnl, n):
    for p in pnl:
        if n % p == 0:
            return pnl
    pnl.append(n)
    return pnl

def isprime(n):
    return True if n == reduce(makepnl, range(3, n + 1, 2), [2])[-1] else False

for i in range(20):
    print i, isprime(i)

Он использует Сито Аткина , быстрее чем выше:

def atkin(limit):
    if limit > 2:
        yield 2
    if limit > 3:
        yield 3

    import math
    is_prime = [False] * (limit + 1)

    for x in range(1,int(math.sqrt(limit))+1):
        for y in range(1,int(math.sqrt(limit))+1):
            n = 4*x**2 + y**2

            if n<=limit and (n%12==1 or n%12==5):
                # print "1st if"                                                                                                                    
                is_prime[n] = not is_prime[n]
            n = 3*x**2+y**2
            if n<= limit and n%12==7:
                # print "Second if"                                                                                                                 
                is_prime[n] = not is_prime[n]
            n = 3*x**2 - y**2
            if x>y and n<=limit and n%12==11:
                # print "third if"                                                                                                                  
                is_prime[n] = not is_prime[n]

    for n in range(5,int(math.sqrt(limit))):
        if is_prime[n]:
            for k in range(n**2,limit+1,n**2):
                is_prime[k] = False

    for n in range(5,limit):
        if is_prime[n]: yield n

def isprime(n):
    r = list(atkin(n+1))
    if not r: return False
    return True if n == r[-1] else False

for i in range(20):
    print i, isprime(i)
3
ответ дан 10.04.2020, 11:37
  • 1
    Успешно переданный Приложение Хранилищу с этими настройками:-) – ıɾuǝʞ 07.02.2020, 08:28
a=input("Enter number:")

def isprime(): 

    total=0
    factors=(1,a)# The only factors of a number
    pfactors=range(1,a+1) #considering all possible factors


    if a==1 or a==0:# One and Zero are not prime numbers
        print "%d is NOT prime"%a


    elif a==2: # Two is the only even prime number
        print "%d is  prime"%a


    elif a%2==0:#Any even number is not prime except two
        print "%d is NOT prime"%a  



    else:#a number is prime if its multiples are 1 and itself 
         #The sum of the number that return zero moduli should be equal to the "only" factors
        for number in pfactors: 
            if (a%number)==0: 
                total+=number
        if total!=sum(factors):
            print "%d is NOT prime"%a 
        else:
             print "%d is  prime"%a
isprime()
0
ответ дан 10.04.2020, 11:38
  • 1
    Только для сообщения моего приложения было вчера утверждено с помощью вышеупомянутой техники..., это теперь совместимо с iPhone 3G и iOS 6! – Jerome 07.02.2020, 08:26

Это небольшое изменение в том, что он отслеживает факторы.

def prime(a):
    list=[]
    x=2
    b=True

    while x<a:
        if a%x==0:
            b=False
            list.append(x)
        x+=1

    if b==False:
        print "Not Prime"
        print list
    else:
        print "Prime"
0
ответ дан 10.04.2020, 11:38
  • 1
    Этот snippet—, когда объединено с тем от @K1w1Geek и основным answer— заверил печатью договор на этой проблеме для меня. I' ve теперь получил версию that' s оба armv6 (который I' ve проверил как работающий над 3G), и armv7 с iPhone 5 запускают изображение (который I' ve, проверенный на 5). Единственная проблема, которую я имел, была то, что некоторые мои более старые двоичные статические библиотеки были только armv6/armv7 или armv7/armv7s, который означал что я couldn' t имеют двоичный файл с armv6/armv7/armv7s. Но that' s не грандиозное предприятие. – Tim Shadel 07.02.2020, 08:26
max=int(input("Find primes upto what numbers?"))
primeList=[]
for x in range(2,max+1):
    isPrime=True
    for y in range(2,int(x**0.5)+1) :
        if x%y==0:
            isPrime=False
            break

    if isPrime:
        primeList.append(x)
print(primeList)
0
ответ дан 10.04.2020, 11:39
  • 1
    Этот armv6/armv7/armv7s метод работал за несколько дней до этого, но теперь кажется, что после успешной загрузки, iTunes посылает это электронное письмо: Недопустимое Изображение - Для приложений для iOS, значки, включенные в двоичное представление, должно быть в формате PNG. – Kashif Hisam 07.02.2020, 08:27

Проверка простых чисел.

def is_prime(x):
    if x < 2:
        return False
    else:
        if x == 2:
            return True
        else:
            for i in range(2, x):
                if x % i == 0:
                    return False
            return True
x = int(raw_input("enter a prime number"))
print is_prime(x)
0
ответ дан 10.04.2020, 11:39
  • 1
    Это нечетно. Мы отправляли приложения уже на этой неделе и никогда не видели тот ответ. Поддержки приложений iOS 3.1 и iPhone 5 включением iPhone 5 запускают изображение. Это - описание iTunes из приложения, выпущенного на этой неделе: " Требования: Совместимый с iPhone, iPod touch и iPad. Требует iOS 3.1, или позже Это приложение оптимизировано для iPhone 5" – K1w1Geek 07.02.2020, 08:29

# is digit prime? we will see (Coder: Chikak)

def is_prime(x): flag = False if x < 2: return False else: for count in range(2, x): if x % count == 0: flag = True break if flag == True: return False return True

-1
ответ дан 10.04.2020, 11:40

Теги

Похожие вопросы