Я новичок и пытаюсь изучать C ++. я читаю Программирование: принципы и практика использования C ++ и в главе 4 приведено упражнение по созданию программы для поиска простых чисел с использованием сита Эратосфена, однако моя программа не работает, и я не уверен, почему.
Когда я пытаюсь скомпилировать его, я получаю следующее предупреждение:
предупреждение C4018:<‘: несоответствие со знаком / без знака
Затем, когда я запускаю его, он падает со следующей ошибкой отладки:
R6010 -abort () был вызван
Я долго смотрел на код и не смог найти ошибку. Я новичок, поэтому я не знаю точно, что signed
а также unsigned
значит, но я пробовал различные материалы для x
вроде 10, 100, 1000.
отладчик показывает:
«Необработанное исключение в 0x759B2EEC в ConsoleApplication1.exe: исключение Microsoft C ++: Range_error в ячейке памяти 0x0031F8C4».
Вот мой код:
#include "../../std_lib_facilities.h"
int main()
{
//program to find all prime numbers up to number input
vector<int> list(2,0); //to skip 0 and 1
int x;
cout << "Find all primes up to: ";
cin >> x;
for (int i = 0; i < (x-1); ++i){
list.push_back(1); //grow the vector and assigns 1
}
for (int i = 0; i < list.size(); ++i){
if (list[i] == 1){ //find the next prime
int c;
c = i;
while (c < list.size()){
c += i; //then finds all its multiples and,
list[c] = 0; //assign 0 to show they can't be primes
}
}
}
for (int i = 0; i < list.size(); ++i){ //goes through the vector
if (list[i] == 1) //write only primes
cout << i << endl;
}
}
В чем причина ошибки?
Проблема, скорее всего, здесь:
for (int i = 0; i < list.size(); ++i){
if (list[i] == 1){
int c;
c = i;
while (c < list.size()){
c += i;
list[c] = 0; //problem is here. On the last loops c+=i is too big
}
}
}
Причина в том, что в самой внешней части цикла вы в конечном итоге i == list.size() - 1
, Сейчас если c > 1
ты получишь c + i > list.size()
тогда вы пытаетесь получить доступ list[c+i]
который является индексом, превышающим размер list
простых чисел. Вот почему, когда вы запускаете его для 1, он работает, но не работает для любого другого большего числа.
Что касается предупреждения компилятора, это потому, что size()
возвращает неподписанное size_t
и ваша переменная цикла i
является подписанным Int. Когда вы сравниваете их, это то, на что жалуется компилятор. Измените цикл на это:
for (size_t i = 0; i < list.size(); ++i){
и ваше предупреждение компилятора исчезнет.
Других решений пока нет …