Robiąc zadanie ze SPOJ'a: https://pl.spoj.pl/problems/POTEGA/ wyskakiwał mi ciągle błąd SIGARBT, natomiast na moim kompie też wyskakiwały mi pełno błędow podczas uruchamiania programu.
Oto kod:
#include <cstdio>
#include <vector>
const int max = 3001;
std::vector <int> l1(max);
std::vector <int> l2;
std::vector <int> p(max);
std::vector <int> w(max);
int char2int(char znak);
//----------------------------------------------------------------------
int main()
{
char znak;
while(1)
{
scanf("%c", &znak);
if(znak == ' ')
break;
l2.push_back( char2int(znak) );
}
l1[max - 1] = 1;
int n;
scanf("%d", &n);
while(n--)
{
for(int i = l2.size() - 1, n1 = 0; i >= 0; i--, n1++)
{
for(int j = max - 1, n2 = n1; j >= 0; j--, n2++)
{
p[n2] += l1[j] * l2[i];
if(p[n2] > 9)
{
p[n2 + 1] = p[n2] / 10;
p[n2] %= 10;
}
}
for(int j = 0; j < max; j++)
{
w[j] += p[j];
if(w[j] > 9)
{
w[j + 1] += w[j] / 10;
w[j] %= 10;
}
}
for(int i = 0; i < max; i++)
{
p[i] = 0;
}
}
for(int i = 0, j = max - 1; i < max; i++, j--)
{
l1[j] = w[i];
}
for(int i = 0; i < max; i++)
{
w[i] = 0;
}
}
for(int i = 0; i < max; i++)
{
if(l1[i] != 0)
{
for( ; i < max; i++)
{
printf("%d", l1[i]);
}
printf("\n");
}
if(i == max - 1)
printf("0\n");
}
return 0;
}
//----------------------------------------------------------------------
int char2int(char znak)
{
return (int) (znak) - 48;
}
Błędy pojawiały się, gdy podstawa potęgi nie była cyfrą (tzn. liczbą jednocyfrową).
Gdy jednak zmieniłem ten fragment:
std::vector <int> l1(max);
std::vector <int> l2;
std::vector <int> p(max);
std::vector <int> w(max);
Na taki:
int l1[max];
std::vector <int> l2;
int p[max];
int w[max];
Wszystko działało ok i SPOJ zaakceptował.
Mógłby mi ktoś wytłumaczyć, co robiłem źle z tymi vectorami?
Z góry dzięki