2016-03-06 2 views
1

Я делаю код вызов, и я нашел некоторые странные вещи происходят с моим кодом, так что я побежал с C++Javascript vs C++, тот же код, отличный результат, почему?

function sumPrimes (num) 
{ 
    var sum=0; 
    for(var i=2; i<num; i++) 
    { 
     if(primeNumber(i)===true) 
      sum+=i; 
    } 
    return sum; 
} 


function primeNumber (i) 
{ 
    if(i==2 || i==3 || i==5 || i==7) 
     return true; 
    if(i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0) 
     return true; 
} 

sumPrimes(977); 

, который дает мне результат в 107812, но когда я делаю то же самое с C++

#include <iostream> 
using namespace std; 
bool primeNumber(int); 
int sumPrimes(int); 
int main() 
{ 
    int n; 
    cout << "n: "; 
    cin >> n; 
    cout << "Sum : " << sumPrimes(n) << endl; 
    system("PAUSE>=0"); 
} 
int sumPrimes(int n) 
{ 
    int sum = 0; 
    for (int i = 2; i < n; i++) 
    { 
     if (primeNumber(i) == true) 
      sum += i; 
    } 
    return sum; 
} 
bool primeNumber(int i) 
{ 
    if (i == 2 || i == 3 || i == 5 || i == 7) 
     return true; 
    if (i % 2 != 0 && i % 3 != 0 && i % 5 != 0 && i % 7 != 0) 
     return true; 
} 

результат 108583.

Может кто-нибудь объяснить, что происходит?

+6

Когда 'primeNumber' возвращает false? Может быть, намек. – erip

+0

Но вы знаете, что основное испытание, которое вы используете, объявляет многие числа как простые, а не первые, а 121? – Ctx

+1

Поведение C++, когда выполнение достигает конца не-void-функции без явного возврата значения, не определено. –

ответ

6

Существуют две основные проблемы с обеими программами.

  • Если вы не удовлетворены, вы никогда не возвращаете false!

Эти языки программирования не может читать ваши мысли, так что они не понимают, что если вы не вернете true, если условие выполнено, вы также хотите, чтобы вернуться false это условие не мет.

Ваш код JS возвращает undefined, если что-то не возвращается после выполнения функции.

Ваш код на C++ действительно вызывает неопределенное поведение (UB), поскольку выполнение достигло конца функции non-void без возвращаемого значения.

К сожалению, ни один из них не гарантирует false. Простое (возможно, наивное?) Решение состоит в том, чтобы просто плюнуть на return false; прямо до конца вьющиеся.

  • Ваш алгоритм неправильный!

Поскольку вы пытаетесь улучшить свои навыки, я оставлю это упражнение, но я бы рекомендовал немного подумать об определении простого числа. :)

+0

мой алгоритм отлично работает около 100, но классический новобранец ошибка, кто-то будет вводить 595295 и мой алгоритм не будет работать лол но благодарит людей, не знал, что JS возвращает неопределенное значение .. и, что еще ошибки мне, почему тот же алгоритм, код, дает разные результаты: S –

+0

@ code_newbie23 Это прекрасно! Если у вас есть еще вопросы, не стесняйтесь добавлять еще один вопрос. – erip

+0

// комментарий был отредактирован –

Смежные вопросы