Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdlib>
- #include <cstdio>
- #include <intrin.h>
- #include <vector>
- #include <ctime>
- #include <cmath>
- using namespace std;
- int rekord;
- class Cduza_liczba{
- public:
- vector <unsigned int> dane;
- int size;
- static const unsigned long long baza=100000*10000;
- static const int bcyfr=9;
- long long cyfr;
- int dodaj_zaokraglenie;
- int glowa;
- bool strata_cyfr;
- Cduza_liczba(int s,int d, unsigned int init)
- {
- size=s;
- dodaj_zaokraglenie=d;
- glowa=size-1;
- dane=vector<unsigned int> (size,0);
- dane[0]=init;
- //baza=b;
- strata_cyfr=false;
- cyfr=0;
- };
- void mnoz (unsigned long long c)//dla 32bit zamienic na u.int
- {
- unsigned long long akumulator=0;
- int i=(glowa+1)%size;
- if (strata_cyfr)
- {
- akumulator=c*dodaj_zaokraglenie;
- strata_cyfr=false;
- }else {akumulator=0;};
- do
- {
- akumulator+=dane[i]*(unsigned long long)c;
- dane[i]=akumulator%baza;
- akumulator/=baza;
- i=(i+1)%size;
- }while (i!=(glowa+1)%size);
- if (akumulator>0)
- {
- glowa=(glowa+1)%size;
- cyfr+=bcyfr;
- if (dane[glowa]>0) strata_cyfr=true;
- dane[glowa]=akumulator;
- }
- };
- unsigned long long przod()
- {
- unsigned long long p;
- int a;
- int g=glowa;
- while ((dane[g]==0)&& (size+g-glowa)%size!=3 ) g=(g-1+size)%size;
- p=dane[(g-1+size)%size]*baza + dane[(g-2+size)%size];
- a=dane[g];
- while (a>0)
- {
- p=p+(a%10)*baza*baza;
- a=a/10;
- p=p/10;
- }
- return p;
- }
- void vprzod(vector<char> &V)
- {
- V.clear();
- int g=(glowa+1)%size;
- int stopg=glowa;
- while (dane[stopg]==0) stopg=(stopg-1+size)%size;
- while (stopg != g)
- {
- //printf("%d%d\n",g,stopg);
- int a=dane[g];
- for (int i=0;i<9;i++)
- {
- V.push_back(a%10);
- a=a/10;
- }
- g=(g+1)%size;
- //printf("blabla");
- }
- int a=dane[g];
- while(a>0)
- {
- V.push_back(a%10);
- a=a/10;
- }
- }
- void wypisz()
- {
- for (int j=0;j<size;j++)
- {
- printf("%09u ", dane[(glowa+size-j)%size]);
- }
- printf("\n %llu g:%d c:%d d:%d s:%d\n",przod(),glowa, cyfr,dodaj_zaokraglenie,strata_cyfr?1:0);
- }
- };
- unsigned long long reverse(unsigned long long x)
- {
- unsigned long long out=0;
- while (x>0)
- {
- out=out*10+(x%10);
- x=x/10;
- }
- return out;
- }
- int powaznytest(vector<char> &va, vector<char> &vb)
- {
- if (va.size()!=vb.size()) return -1;
- unsigned long long koncowka=0, waga=1; //wszystko mod (2^64);
- int j=0;
- int size =va.size();
- do{
- j++;
- koncowka+=((unsigned long long)va[size-j])*waga;
- if ( va[size-j]!=vb[size-j] ) return -1;
- waga=waga*10;
- }while (((koncowka% ( ((unsigned long long)1) <<j )) ==0 ) && (j<=64) );
- return j-1;
- }
- unsigned long long p10(int x)
- {
- unsigned long long r=1;
- for (;x>0;x--)
- r=r*10;
- return r;
- }
- int main()
- {
- //----test
- Cduza_liczba liczbaA(7,0, 1);
- Cduza_liczba liczbaB(7,1, 1);
- unsigned long long skrA, skrB;
- printf("\n");
- liczbaA.wypisz();
- printf("\n");
- liczbaB.wypisz();
- printf("\n");
- unsigned long long licznik=0,kolejnycel=0;
- vector<char> V;
- for (int j=1;j<=10;j++)
- {
- liczbaA.mnoz(5); //najszybciej jak to mozliwe wychpdzimy poza zakres gdy trzymamy zera wiodące
- liczbaB.mnoz(5);
- liczbaA.wypisz();
- printf("%llu\n",reverse(liczbaA.przod()));
- liczbaB.wypisz();
- printf("%llu\n",reverse(liczbaA.przod()));
- liczbaA.vprzod(V);
- printf("\ntest: ");
- for (int j=V.size()-1;j>=0;j--) printf("%d",V[j]);
- printf("\n\n");
- }
- printf("------------------------\n\n");
- //--------------------wlsciwa zabawa------------------
- const int dokladnosc =7;
- liczbaA=Cduza_liczba (dokladnosc,0, 1);
- liczbaB=Cduza_liczba (dokladnosc,1, 1);
- liczbaA.wypisz();
- liczbaB.wypisz();printf("\n");
- rekord=0;
- vector <unsigned long long> wyniki;
- vector<char> va,vb;
- int licz=0;
- while (licz<=63)
- {
- skrA=liczbaA.przod();
- skrB=liczbaB.przod();
- if (skrA!=skrB) { printf("za mala dokladnosc\n");break; }
- unsigned long long odw=reverse(skrA);
- licz=0;
- while ((odw%2==0)&&(odw>0))
- {
- licz++;
- odw/=2;
- }
- if (licz>=17)
- {
- liczbaA.vprzod(va);
- liczbaB.vprzod(vb);
- licz = powaznytest(va,vb);
- }
- if (licz==-1){ printf("za mala dokladnosc w powaznym tescie\n"); return 0;}
- if (licz>rekord)
- {
- rekord=licz;
- if (licz>=17)
- {
- printf("r %d %llu ",rekord,licznik);
- for (int j=va.size()-1;j>=va.size()-licz;j--) printf("%d",va[j]);
- printf("\n");
- }else
- printf("r %d %llu %llu\n",rekord,licznik,reverse(skrA) %p10(licz));
- }
- liczbaA.mnoz(5);
- liczbaB.mnoz(5);
- licznik++;
- }
- printf("OK\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement