2015-11-11 1 views
0

Я пытаюсь сделать Удивительная Prime Series (APS), в котором есть вектор myvector myvector [0] = myvector [1] = 0Почему мой код дает Runtime Error?

При п> 1, myvector [п] = myvector [п - 1] + f (n), где f (n) - наименьший простой множитель n.

ВХОД 3 (Нет. Тестов)

2 
3 
4 

ВЫВОД

2 
5 
7 


#include<iostream> 
#include<math.h> 
#include<vector> 
using namespace std; 
bool isPrime(int p) 
{ 
int c=sqrt(p); 
if(c==1) 
{ 
    return true; 
} 
else 
{ 
    for(int i=2;i<=c;i++) 
    {if(p%i==0) 
     {return false;} 
    else 
     {return true;} 
    } 
} 
} 
int func(int n1) 
{ 
    if(n1%2==0) 
    { 
     return 2; 
    } 
    else 
    { 
     if(isPrime(n1)==true) 
     { 
      return n1; 
     } 
     else 
     { 
     int c1= sqrt(n1); 
      for(int i=2;i<=c1;i++) 
      { 
       if(n1%i==0 && isPrime(i)==true) 
       { 
        return i; 
       } 
      } 
     } 
    } 
} 
main() 
{ 
    int t; 
    std::vector<int> myvector; 
    myvector[0]=myvector[1]=0; 
    while(t--) 
    { 
     int n; 
     cin>>n; 
     while(n>1) 
     { 
      myvector[n]=myvector[n-1]+func(n); 
      cout<<myvector[n]<<endl; 
     } 
    } 
} 
+0

Ошибка _What_ - это ваш код? – emlai

+0

Он дает ошибку времени выполнения, поэтому не отображается на экране консоли –

+0

t не имеет значения инициализации и доступа к вектору через индекс, который вам нужен для std :: vector myvector (10); // 10 нулевых инициализированных элементов – Sigstop

ответ

2

Ваш вектор пуст, любая индексация в нем будет вне границ и приводят к непредсказуемому поведению ,

Либо вам нужно указать resize вектор, если вы знаете точный размер, или вы должны push back элементов по мере необходимости.


И проблема с вектором не только неопределенного поведения у вас есть. Вы используете локальную переменную t без ее инициализации, что означает, что ее значение будет неопределенным и с его использованием, кроме инициализации, также приведет к UB.

+1

вектор не нуждается в определенном размере. Я думаю, вы пытались сказать: «Ваш вектор пуст». – cdonat

+0

Я хочу динамический размер. Как я могу это сделать? –

+0

@cdonat Я заполняю значения внутри вектора. Нужно ли его ин вилизовать во время объявления, а затем переопределить значения? –

1

Заполните вектор с push_back():

auto main(int, char**) -> int // <- corrected function prototype 
{ 
    // this loop construct is ugly. use a for loop, when that is what you intent. 
    // int t = 42; // <- t was not initialized 
    // while(t--) 
    for(int t = 0; t < 42; t++) 
    { 
     int n; 
     cin >> n; 

     // we create a new vector in each run through the loop. 
     auto myvector = std::vector<int>{0, 0}; 
     // your loop did never break, because you changed nothing of 
     // the condition inisde. 
     for(int i = 1; i < n; i++) 
     { 
      myvector.push_back(myvector.back() + func(i)); 
      std::cout << myvector.back() << std::endl; 
     } 
    } 
} 

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

BTW .: Вам не нужно хранить все значения последовательности:

auto main(int, char**) -> int 
{ 
    for(int t = 0; t < 42; t++) 
    { 
     int n; 
     cin >> n; 

     int current = 0; 
     for(int i = 1; i < n; i++) 
     { 
      current += func(i); 
      std::cout << current << std::endl; 
     } 
    } 
} 

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

Остерегайтесь: весь код не проверен и может содержать больше ошибок.