Pagini recente » Cod sursa (job #1686396) | Cod sursa (job #1105301) | Cod sursa (job #864944) | Cod sursa (job #274178) | Cod sursa (job #2549239)
#include <fstream>
using namespace std;
ifstream f("numere2.in");
ofstream g("numere2.out");
int i,j,nrB;
char cf;
struct vectr{
int v[1002];
};
vectr a,b;
vectr zero( ){
vectr d;
for(int i=0;i<=102;i++) d.v[i]=0;
return d;
}
int compar ( vectr a, vectr b ){
if(a.v[0]!=b.v[0]) return a.v[0]<b.v[0];
int i=a.v[0];
while(a.v[i]==b.v[i]&&i>=1) i--;
if(i==0) return 2;
if(a.v[i]<b.v[i]) return 1;
return 0;
}
vectr inmultire( vectr a, vectr b ){
//c=a*b
//a>=b
vectr c;
int t;
c=zero();
for(int i=1;i<=b.v[0];i++){
for(int j=1;j<=a.v[0];j++){
if(j+i-1>c.v[0]) c.v[0]=j+i-1;
c.v[j+i-1]+=(a.v[j]*b.v[i]+t);
t=c.v[j+i-1]/10; c.v[j+i-1]%=10;
}
while(t!=0){
c.v[++c.v[0]]=t%10; t/=10;
}
}
return c;
}
vectr ridput(vectr a,int n){
vectr c;
c=zero(); c.v[0]=c.v[1]=1;
while(n!=0){
if(n%2==1) {
if(compar(c,a)!=0) c=inmultire(a,c);
else c=inmultire(c,a);
n--;
}
a=inmultire(a,a); n/=2;
}
return c;
}
vectr scad1(vectr a){
int t=0,i;
vectr c;
c=zero();
c.v[++c.v[0]]=a.v[1]-1;
if(c.v[1]<0) {
c.v[1]=9; t=1;
}
i=2;
while(i<=a.v[0]){
c.v[++c.v[0]]=a.v[i]-t;
if(c.v[i]<0) {
c.v[i]=9; t=1;
} else t=0;
i++;
}
while(c.v[c.v[0]]==0) c.v[0]--;
return c;
}
vectr adun( vectr a, vectr b ){
//a>=b
vectr c;
int t=0;
c=zero();
c.v[0]=a.v[0];
for(int i=1;i<=b.v[0];i++) {
c.v[i]=b.v[i]+a.v[i]+t;
t=c.v[i]/10; c.v[i]%=10;
}
for(int i=b.v[0]+1;i<=a.v[0];i++){
c.v[i]=a.v[i]+t;
t=c.v[i]/10; c.v[i]%=10;
}
while(t!=0){
c.v[++c.v[0]]=t%10; t/=10;
}
return c;
}
vectr mijloc( vectr a, vectr b ){
// c=(a+b)/2;
// a>=b
int nr;
vectr c;
c=adun(a,b);
vectr d;
d=zero();
int i=c.v[0];
nr=0;
while(i>=1){
nr=nr*10+c.v[i];
d.v[++d.v[0]]=nr/2;
nr%=2; i--;
}
c.v[0]=0;
for(i=d.v[0];i>=1;i--) c.v[++c.v[0]]=d.v[i];
while(c.v[c.v[0]]==0) c.v[0]--;
return c;
}
vectr cautA( vectr t){
int i=1,ok=1;
vectr st,dr,mijl;
vectr d,c,rasp,b;
while(ok==1){
st=zero(); dr=t;
st.v[0]=st.v[1]=1;
int ex=0;
while(compar(st,dr)!=0){
mijl=mijloc(dr,st);
c=ridput(mijl,i);
int x=0;
x=compar(c,t);
if(x!=0){
if(x==2){ rasp=mijl; ex=1; nrB=i; }
d=zero(); d.v[0]=d.v[1]=1;
st=adun(mijl,d);
} else dr=scad1(mijl);
}
b=ridput(st,i);
if(compar(b,t)==2) { rasp=mijl; ex=1; nrB=i; }
if(ex==0){
d.v[0]=1; d.v[1]=2;
if(compar(st,d)==2) ok=0;
}
i++;
}
return rasp;
}
int main()
{
while(f>>cf) a.v[++a.v[0]]=cf-'0';
for(i=a.v[0];i>=1;i--) b.v[++b.v[0]]=a.v[i];
a=b; //a.v[0]=1; a.v[1]=4;
b=cautA(a);
for(i=b.v[0];i>=1;i--) g<<b.v[i];
g<<'\n';
g<<nrB<<'\n';
return 0;
}