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

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

it 'используется при вызове sortPeoples ([' array ',' of ',' properties '], reverse = false)

///////////////////////example array of peoples ///////////////////////

var peoples = [
    {name: "Zach", surname: "Emergency", age: 1},
    {name: "Nancy", surname: "Nurse", age: 1},
    {name: "Ethel", surname: "Emergency", age: 1},
    {name: "Nina", surname: "Nurse", age: 42},
    {name: "Anthony", surname: "Emergency", age: 42},
    {name: "Nina", surname: "Nurse", age: 32},
    {name: "Ed", surname: "Emergency", age: 28},
    {name: "Peter", surname: "Physician", age: 58},
    {name: "Al", surname: "Emergency", age: 58},
    {name: "Ruth", surname: "Registration", age: 62},
    {name: "Ed", surname: "Emergency", age: 38},
    {name: "Tammy", surname: "Triage", age: 29},
    {name: "Alan", surname: "Emergency", age: 60},
    {name: "Nina", surname: "Nurse", age: 58}
];



//////////////////////// Sorting function /////////////////////
function sortPeoples(propertyArr, reverse) {
        function compare(a,b) {
            var i=0;
            while (propertyArr[i]) {
                if (a[propertyArr[i]] < b[propertyArr[i]])  return -1;
                if (a[propertyArr[i]] > b[propertyArr[i]])  return 1;
                i++;
            }
            return 0;
            }
        peoples.sort(compare);
        if (reverse){
            peoples.reverse();
        }
    };

////////////////end of sorting method///////////////
function printPeoples(){
  $('#output').html('');
peoples.forEach( function(person){
 $('#output').append(person.surname+" "+person.name+" "+person.age+"<br>");
} )
}
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
</head>
  <html>
  <body>
<button onclick="sortPeoples(['surname']); printPeoples()">sort by ONLY by surname ASC results in mess with same name cases</button><br>
<button onclick="sortPeoples(['surname', 'name'], true); printPeoples()">sort by surname then name DESC</button><br>
<button onclick="sortPeoples(['age']); printPeoples()">sort by AGE ASC. Same issue as in first case</button><br>
<button onclick="sortPeoples(['age', 'surname']); printPeoples()">sort by AGE and Surname ASC. Adding second field fixed it.</button><br>
        
    <div id="output"></div>
    </body>
  </html>

29
задан Chris 16 September 2013 в 17:51
поделиться

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))
62
ответ дан Steven Rumbalski 16 September 2013 в 17:51
поделиться
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-простое число-питон

19
ответ дан nbro 16 September 2013 в 17:51
поделиться
def is_prime(n):
    return all(n%j for j in xrange(2, int(n**0.5)+1)) and n>1
12
ответ дан Vinayak Kaniyarakkal 16 September 2013 в 17:51
поделиться

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

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

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

  1. Вы должны отслеживать числа, которые вы уже нашли, которые являются простыми и делятся только на них. Зачем делить на 4, если вы уже поделили на 2? Если число делится на 4, оно также делится на 2, так что вы бы его уже поймали, и нет необходимости делить на 4.
  2. Вам нужно только проверить до квадратного корня из тестируемого числа, потому что любой фактор, больший, чем этот, должен быть умножен на число меньше этого, и это уже было бы проверено к тому времени, когда вы доберетесь до больше.
10
ответ дан kindall 16 September 2013 в 17:51
поделиться

Этот пример - использовать 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
ответ дан Community 16 September 2013 в 17:51
поделиться

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

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
ответ дан dasdachs 16 September 2013 в 17:51
поделиться

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

2
ответ дан Ofir Israel 16 September 2013 в 17:51
поделиться

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

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
ответ дан CodingOcean 16 September 2013 в 17:51
поделиться

После того, как вы определили, что число составное (а не простое), ваша работа завершена. Вы можете выйти из цикла с помощью 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
ответ дан Prashant Kumar 16 September 2013 в 17:51
поделиться
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
ответ дан Mansueli 16 September 2013 в 17:51
поделиться

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

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
ответ дан saegarde 16 September 2013 в 17:51
поделиться
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
ответ дан Datta Munde 16 September 2013 в 17:51
поделиться

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

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
ответ дан KillianDS 16 September 2013 в 17:51
поделиться

# 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
ответ дан Rao 16 September 2013 в 17:51
поделиться
Другие вопросы по тегам:

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