// pwgen pentru RST
// realizat de : alexalghisi
#include <iostream>
#include <fstream>
#include <string.h>
#include <cmath>
#include <vector>
#include <ctime>
using namespace std;
string cs;
int x;
vector<char> v;
vector<int> poz;
char nume[20];
struct HUGE{int x[100];};
HUGE rez;
time_t secondsvechi,secondsnou;
char *Read()
{
cout<<"---------------------------------------------------------------------\n";
cout<<"| Introduceti numele fisierului in care se vor salva parolele : ";
cin.getline(nume, 100);
return nume;
}
ofstream g(Read());
vector<int> adun(vector<int> &a )
{
vector<int> b(1,1);
vector<int> c;
int t=0;
for(unsigned int i=0;i<a.size() || i<b.size() || t>0;i++)
{
int x=(i<a.size())?a[i]:0;
int y=(i<b.size())?b[i]:0;
c.push_back((x+y+t)%10);
t=(x+y+t)/10;
}
return c;
}
bool modulo(vector<int> &m)
{
for(int i=0;i<=5;i++)
if(m[i]!=0)
return false;
return true;
}
void afisez(vector<int> &m)
{
for(int i=m.size()-1;i>=0;i--)
printf("%d",m[i]);
return;
}
void pr(int niv)
{
if(niv==x)
{
poz=adun(poz);
for(unsigned int i=0;i<v.size();i++)
g<<v[i];
g<<"\n";
if(modulo(poz))
{
secondsnou = time (NULL);
cout<<"Au fost generate ";
afisez(poz);
cout<<" cuvinte , in :" ;
cout<<( secondsnou-secondsvechi )<<" secunde ";
cout<<"\n";
secondsvechi = time(NULL);
}
return;
}
for(unsigned int i=0;i<cs.size();i++)
{
v.push_back(cs[i]);
pr(niv+1);
v.pop_back();
}
}
HUGE AtribValue(unsigned long long X)
{
HUGE H;
H.x[0] = 0;
while (X)
{
++H.x[0];
H.x[H.x[0]] = X % 10;
X /= 10;
}
return H;
}
HUGE produs(HUGE A, HUGE B)
/* C <- A x B */
{
HUGE C;
int i,j,T=0;
C.x[0]=A.x[0]+B.x[0]-1;
for (i=1;i<=A.x[0]+B.x[0];) C.x[i++]=0;
for (i=1;i<=A.x[0];i++)
for (j=1;j<=B.x[0];j++)
C.x[i+j-1]+=A.x[i]*B.x[j];
for (i=1;i<=C.x[0];i++)
{ T=(C.x[i]+=T)/10;
C.x[i]%=10;
}
if (T) C.x[++C.x[0]]=T;
return C;
}
HUGE put(int baza,int putere)
{
if(putere==0)
{
HUGE zero;
zero.x[0]=1;
zero.x[1]=1;
return zero;
}
if(putere==1)
return AtribValue(baza);
if(putere%2==0)
{
HUGE X=put(baza,putere/2);
return produs(X,X);
}
return produs(AtribValue(baza),put(baza,putere-1));
}
HUGE Divide(HUGE A, int X)
{
int i;
unsigned long R=0;
for (i=A.x[0];i;i--)
{ A.x[i]=(R=10*R+A.x[i])/X;
R%=X;
}
while (!A.x[A.x[0]] && A.x[0]>1) A.x[0]--;
return A;
}
int main()
{
cout<<"| Introduceti caracterele din care sa fie compuse cuvintele : ";
getline(cin,cs);
cout<<"| Introduceti lungimea cuvintelor : ";
cin>>x;
cout<<"| Numarul de parole care vor fi generate : ";
rez=put(cs.size(),x);
for(int i=rez.x[0];i>=1;i--)
cout<<rez.x[i];
// Urmatoarele sunt doar de test
HUGE memorie=rez;
cout<<"\n| Spatiu ocupat aproximativ : "; // memorie ocupata
memorie=produs(memorie,AtribValue(x+2));
memorie=Divide(memorie,1024);
memorie=Divide(memorie,1024);
for(int i=memorie.x[0];i>=1;i--)
cout<<memorie.x[i];
cout<<" MB";
cout<<"\n| Timpul mediu necesar : "; // timp necesar
rez=Divide(rez,166666); // procesor mediu
rez=Divide(rez,60);
for(int i=rez.x[0];i>=1;i--)
cout<<rez.x[i];
cout<<" minute";
cout<<"\n| Continuam ? (Y/N) :";
char ch;
cin>>ch;
if(ch=='Y' || ch=='y')
{
printf("\nSe genereaza ...\n");
secondsvechi = time (NULL);
pr(0);// genereaza
printf("Au fost generate : " );
afisez(poz);
printf(" parole ");
printf("\nAm terminat :)");
}
return 0;
}