Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // blabla.cpp : Defines the entry point for the console application.
- //
- #include <cstdlib>
- #include <cstdio>
- #include <intrin.h>
- #include <vector>
- #include <ctime>
- 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 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 main()
- {
- //----test
- Cduza_liczba liczbaA(5,0, 1);
- Cduza_liczba liczbaB(5,1, 1);
- unsigned long long skrA, skrB;
- printf("\n");
- liczbaA.wypisz();
- printf("\n");
- liczbaB.wypisz();
- printf("\n");
- unsigned long long licznik=0,kolejnycel=0;
- for (int j=1;j<=130;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\n",reverse(liczbaA.przod()));
- }
- printf("------------------------\n\n");
- //--------------------wlsciwa zabawa------------------
- const int dokladnosc =6;
- 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;
- int licz=0;
- while (licz<=23)
- {
- 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>18) break;
- if (licz>rekord)
- {
- rekord=licz;
- printf(" %d %llu %llu\n",rekord,licznik,reverse(skrA));
- //liczbaA.wypisz();
- }
- liczbaA.mnoz(5);
- liczbaB.mnoz(5);
- licznik++;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement