Pagini recente » Cod sursa (job #1335280) | Cod sursa (job #12609) | Cod sursa (job #2749749) | Cod sursa (job #2451362) | Cod sursa (job #1464010)
# include <bits/stdc++.h>
using namespace std;
ifstream fi("numere2.in");
ofstream fo("numere2.out");
typedef int big[205];
char c[105];
big a,p,u;
void atrib(big a,big b)
{
for (int i = 0;i < 205;++i) a[i] = b[i];
}
void mul(big a,big b)
{
big c;
for (int i = 0;i < 205;++i) c[i] = 0;
for (int i = 1;i <= a[0];++i)
for (int j = 1;j <= b[0];++j)
{
c[i+j-1] += a[i] * b[j];
}
c[0] = a[0] + b[0] - 1;
int t = 0,i;
for (i = 1;i <= c[0] || t;++i)
{
t += c[i];
c[i] = t % 10;
t /= 10;
}
c[0] = i - 1;
for (int i = 0;i <= c[0];++i) a[i] = c[i];
}
void add(big a,big b)
{
int i,t = 0;
for (i = 1;i <= max(a[0],b[0]) || t;++i)
{
t += a[i] + b[i];
a[i] = t % 10;
t /= 10;
}
a[0] = i - 1;
}
void div2(big a)
{
int t = 0;
for (int i = a[0];i;--i)
{
t = t * 10 + a[i];
a[i] = t / 2;
t &= 1;
}
while (a[0] > 0 && !a[a[0]]) --a[0];
}
int cmp(big a,big b)
{
if (b[0] > a[0]) return 1;
if (b[0] < a[0]) return 2;
for (int i = a[0];i;--i) if (a[i] != b[i]) return b[i] > a[i] ? 1:2;
return 0;
}
void pls(big a)
{
++a[1];
int cnt = 1;
while (a[cnt] > 9)
{
a[cnt+1] += a[cnt] / 10;
a[cnt] %= 10;++cnt;
}
a[0] = max(a[0],cnt);
}
void mns(big a)
{
int cnt = 1;
while (!a[cnt])
{
a[cnt] = 9;
++cnt;
}
--a[cnt];
if (cnt == a[0] && !a[cnt]) --a[0];
}
void print(big a)
{
for (int i = a[0];i;--i) cout << a[i];cout << ' ';
}
void atrib(big a,int x)
{
for (int i = 0;i < 205;++i) a[i] = 0;
while (x) a[++a[0]] = x % 10,x /= 10;
}
void pow(big d,int x)
{
if (d[0] * x > 100)
{
atrib(u,d);
mns(u);
return;
}
int g = x;
big ans,h;
atrib(h,d);
atrib(ans,1);
while (g)
{
if (g&1) mul(ans,d);
mul(d,d);
g >>= 1;
}
int o = cmp(ans,a);
if (!o)
{
for (int i = h[0];i;--i) fo << h[i];fo << '\n';
fo << x << '\n';exit(0);
}
if (o == 1)
{
atrib(p,h);
pls(p);
}
else
{
atrib(u,h);
mns(u);
}
}
int main(void)
{
fi>>(c+1);
a[0] = strlen(c+1);
for (int i = a[0];i;--i) a[a[0] - i + 1] = c[i] - '0';
for (int i = 335;i;--i)
{
atrib(p,1);
atrib(u,a);
while (cmp(p,u) <= 1)
{
big m;
atrib(m,p);
add(m,u);
div2(m);
pow(m,i);
}
}
return 0;
}