Та же программа в Kotlin дает другой результат, чем в Python - PullRequest
0 голосов
/ 11 июня 2018

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

Первый в Kotlin:

import kotlin.math.floor
import kotlin.math.sqrt

fun isPrime(n: Int): Boolean {
    if (n == 1) return false
    else if (n < 4) return true
    else if (n % 2 == 0) return false
    else if (n < 9) return true
    else if (n % 3 == 0) return false
    else {
        val r = floor(sqrt(n.toDouble())).toInt()
        var f = 5
        while (f <= r) {
            if (n % f == 0) return false
            else if (n % (f + 2) == 0) return false
            f += 6
        }
        return true
    }
}

fun main(args: Array<String>) {
    var sum = 5
    var n = 5
    while (n <= 2000000) {
        if (isPrime(n)) sum += n
        n += 2
        if (n <= 2000000 && isPrime(n)) sum += n
        n += 4
    }

    println(sum)
}

вывод 1179908154

Затем тот в Python:

import math

def isPrime(n):
    if n==1 :
        return False
    elif n<4 :
        return True
    elif n%2==0:
        return False
    elif n<9:
        return True
    elif n%3==0:
        return False
    else:
        r=math.floor(math.sqrt(n))
        f=5
        while(f<=r):
            if n%f==0:
                return False
            elif n%(f+2)==0:
                return False
            f+=6
    return True

sum =5
n =5
while n<=2000000:
    if isPrime(n):
        sum+=n
    n+=2
    if n<=2000000 and isPrime(n):
        sum+=n
    n+=4
print(sum)

Вывод142913828922

Эти две программы одинаковы, но почему они дали мне разные ответы?И .... Впервые задайте вопрос на английском.Извините за язык.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Похоже на переполнение со стороны Котлина.Kotlin все еще ограничен JVM, и вы, вероятно, обрабатываете значения, которые просто слишком велики для Int.

Если вы преобразуете все в Kotlin в Long, вы получите тот же номер, что и в Python.Примечание: Python неявно преобразует большие числа в тип long-like, поэтому вам не нужно делать это самостоятельно, но это разительная разница между двумя языками.

fun isPrime(n: Long): Boolean {
    if (n == 1L) return false
    else if (n < 4) return true
    else if (n % 2 == 0L) return false
    else if (n < 9) return true
    else if (n % 3 == 0L) return false
    else {
        val r = floor(sqrt(n.toDouble())).toInt()
        val r1 = floor(sqrt(n.toDouble()))
        var f = 5
        while (f <= r) {
            if (n % f == 0L) return false
            else if (n % (f + 2L) == 0L) return false
            f += 6
        }
        return true
    }
}
0 голосов
/ 11 июня 2018

Это случай скачка целочисленного предела ( переполнение ).

Вывод Python корректен.Если вы видите фактическое значение 142913828922, это превышает 32-битный предел kotlin int, то есть 2 ^ 37.Я не знаю, код Котлин, но вы можете использовать Java-эквивалент long для этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...