Zaraz mnie normalnie jasna Anielka weźmie w te i z powrotem.
#include <iostream>
#include <string>
#include <cctype>
#include <vector>
using namespace std;
struct huge {vector<char>num; huge();};
huge::huge():num(102,0){}
inline huge hmax () {huge res;for(int i=0;i<102;++i) res.num[i]=9; return res;}
inline bool comp (huge a, huge b) {return (a.num==b.num);}
inline bool even (huge n) {return (n.num[101]%2==0);}
inline bool zero (huge n)
{for(int i=0;i<102;++i) if(n.num[i]!=0) return false; return true;}
inline string out(huge output);
inline bool grtr (huge a, huge b)
{
for(int i=0;i<102;++i)
{
if(a.num[i]>b.num[i]) return true;
if(a.num[i]<b.num[i]) return false;
}
return false;
}
inline huge decr(huge n)
{
for(int i=101;i>=0;--i)
if(n.num[i]>0) {--n.num[i]; return n;}
else n.num[i]=9;
return n;
}
inline huge incr(huge n)
{
for(int i=101;i>=0;--i)
if(n.num[i]<9) {++n.num[i]; return n;}
else n.num[i]=0;
return n;
}
inline huge div2(huge n)
{
for(int i=101;i>=0;--i)
if(n.num[i]%2==0) n.num[i]/=2;
else
{
n.num[i]/=2; n.num[i+1]+=5;
if(n.num[i+1]>=10) {n.num[i+1]-=10; n.num[i]+=1;}
}
return n;
}
inline huge addc (huge a, huge b)
{
for(int i=101;i>=0;i--)
{a.num[i]+=b.num[i]; if(a.num[i]>=10) {a.num[i]-=10; a.num[i-1]+=1;}}
return a;
}
inline huge mult (huge a, huge b)
{
huge res;
for(int i=101;i>=0;--i) if(a.num[i]!=0)
for(int j=101;j>=0;--j) if(b.num[j]!=0)
{
huge hlp;
if(i+j-101<0) return (hmax());
hlp.num[i+j-101]=(a.num[i]*b.num[j])%10;
if((a.num[i]*b.num[j])/10!=0)
if(i+j-102<0) return (hmax());
else hlp.num[i+j-102]=(a.num[i]*b.num[j])/10;
res=addc(res,hlp);
}
return res;
}
inline huge itoh(int n)
{huge res; for(int i=0;n>0;++i) {res.num[101-i]=n%10; n/=10;} return res;}
inline huge pow(huge k, huge n)
{
if(zero(n)) return itoh(1);
if(!even(n))
{return mult(k,pow(k,decr(n)));}
huge hlp=pow(k,div2(n)); return mult(hlp,hlp);
}
inline huge mean (huge a, huge b)
{huge res=addc(a,b); if(!even(res)) res=decr(res); res=div2(res); return res;}
inline huge stoh(string input)
{
huge res;
for(int i=input.size()-1;i>=0;--i)
res.num[102-input.size()+i]=int(input[i]-'0');
return res;
}
inline huge read(void)
{
string res;
while(!isdigit(cin.peek())) cin.ignore();
char hlp=cin.get(); while(isdigit(hlp)) {res+=hlp; hlp=cin.get();}
return stoh(res);
}
inline string out(huge output)
{
int i=0; while(output.num[i]==0) ++i;
string res; for(;i<102;++i) res+=char('0'+output.num[i]);
return res;
}
huge wysz (huge n, huge p)
{
huge a=itoh(1); huge b=incr(p);
huge res=mean(a,b); cerr << out(a) << '\t' << out(res) << '\t' << out(b) << '\n';
huge hlp; hlp=pow(res,n);
while(!comp(hlp,p))
{
if(grtr(hlp,p)) b=res;
else a=res;
res=mean(a,b); cerr << out(a) << '\t' << out(res) << '\t' << out(b) << '\n';
hlp=pow(res,n);
}
return res;
}
int main()
{
ios_base::sync_with_stdio(false);
int n; while(cin >> n) cout << out(wysz(itoh(n),read())) << '\n';
return 0;
}
Próbuję rozwiązać to zadanie: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=49 Idea jest taka, żeby wyszukiwać ten pierwiastek binarnie. (gdyby to się okazało zbyt wolne, zamierzałem pomyśleć o newtonie-raphsonie).
Nie pamiętam, ile spędziłem już godzin usuwając z tego kodu rozmaite bugi, wsadzone najczęściej przez zwykłą nieuwagę. Aż dotarłem do momentu, gdzie w samym środku obliczeń dla bliżej nie poznanej przyczyny program wyrzuca SIGABRT... patrz link do Ideone.
Za nic nie potrafię znaleźć, skąd kurka wodna pojawia się ten błąd. Testowałem każdą funkcję z osobna. W końcu postanowiłem spróbować wyłapać ten sygnał i wypisać za pomocą cerra, któa funkcja i dla jakich parametrów podniosła SIGABTR: http://ideone.com/riFOOa
Za szlag. SIGSEGV od razu.
Tutaj już autentycznie coś mnie trafiło. Mam dość. Nie wiem, jak dojść do tego, która funkcja podnosi sigabrt a już tym bardziej do tego, jak doszedłem do sigsegvu.
Czy mógłbym kogoś prosić o wskazanie błędu? Dzięki!