Advertisement
bartekltg

pasowanie koncowek 5^q do początkow 2^p

Jun 20th, 2011
362
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.37 KB | None | 0 0
  1. // blabla.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include <cstdlib>
  5. #include <cstdio>
  6. #include <intrin.h>
  7. #include <vector>
  8. #include <ctime>
  9.  
  10. using namespace std;
  11.  
  12. const unsigned long long maxx=100000*(unsigned long long)100000*(unsigned long long)100000*(unsigned long long)1000;
  13.  
  14. vector< vector< char > >tabela;
  15.  
  16. int rekord;
  17.  
  18. class Cduza_liczba{
  19. public:
  20.     vector <unsigned int> dane;
  21.     int size;
  22.     static const unsigned long long baza=100000*10000;
  23.     static const int bcyfr=9;
  24.     long long cyfr;
  25.     int dodaj_zaokraglenie;
  26.     int glowa;
  27.     bool strata_cyfr;
  28.  
  29.     Cduza_liczba(int s,int d, unsigned int init)
  30.     {
  31.         size=s;
  32.         dodaj_zaokraglenie=d;
  33.         glowa=size-1;
  34.         dane=vector<unsigned int> (size,0);
  35.         dane[0]=init;
  36.         //baza=b;
  37.         strata_cyfr=false;
  38.         cyfr=0;
  39.     };
  40.     void mnoz (unsigned long long c)//dla 32bit zamienic na u.int
  41.     {
  42.         unsigned long long akumulator=0;
  43.        
  44.         int i=(glowa+1)%size;
  45.        
  46.         if (strata_cyfr)
  47.         {
  48.             akumulator=c*dodaj_zaokraglenie;
  49.             strata_cyfr=false;
  50.         }else {akumulator=0;};
  51.        
  52.         do
  53.         {
  54.             akumulator+=dane[i]*(unsigned long long)c;
  55.             dane[i]=akumulator%baza;
  56.             akumulator/=baza;
  57.             i=(i+1)%size;
  58.  
  59.         }while (i!=(glowa+1)%size);
  60.  
  61.         if (akumulator>0)
  62.         {
  63.             glowa=(glowa+1)%size;
  64.             cyfr+=bcyfr;
  65.             if (dane[glowa]>0)  strata_cyfr=true;
  66.             dane[glowa]=akumulator;
  67.         }
  68.        
  69.     };
  70.     unsigned long long przod()
  71.     {
  72.         unsigned long long p;
  73.         int a;
  74.         p=dane[(glowa-1+size)%size]*baza + dane[(glowa-2+size)%size];
  75.         a=dane[glowa];
  76.         p=p*10;
  77.         while (a>0)
  78.         {
  79.             p=p/10+(a%10)*baza*baza;
  80.             a=a/10;
  81.         }
  82.         return p;
  83.     }
  84.     void wypisz()
  85.     {
  86.         for (int j=0;j<size;j++)
  87.         {
  88.             printf("%09u ", dane[(glowa+size-j)%size]);
  89.         }
  90.         printf(" %llu g:%d c:%d d:%d s:%d",przod(),glowa, cyfr,dodaj_zaokraglenie,strata_cyfr?1:0);
  91.     }
  92. };
  93.  
  94.  
  95. bool test(unsigned long long x)
  96. {
  97.     unsigned long long dzielnik=100000000000000000; // 10^17;
  98.     int indeks=0;
  99.     if (x/dzielnik!=52 ) return false;
  100.  
  101.     //printf("52");
  102.     dzielnik/=10;
  103.  
  104.     for (int j=0;j<=16;j++)
  105.     {
  106.        
  107.         int cyfra = (x/dzielnik)%10;
  108.         //printf("%d",cyfra);
  109.         if (cyfra == tabela[j][indeks])
  110.         {
  111.         }else
  112.         if(cyfra == tabela[j][indeks+(1<<j)])
  113.         {
  114.             indeks=indeks+(1<<j);
  115.         }else return false;
  116.         dzielnik=dzielnik/10;
  117.         if (j>rekord) rekord=j;
  118.    
  119.     }
  120.     return true;
  121.     printf("huuuuuuraaaaaaa");
  122.  
  123. }
  124.  
  125. int main()
  126. {
  127.     rekord=0;
  128.  
  129.  
  130.     printf("halo\n");
  131.     long long a,b,c,d, p, dzielnik;
  132.     a=1;
  133.     while (a<maxx) a*=5;
  134.     a=a%maxx;
  135.     p=a;
  136.     dzielnik=10;
  137.     for (int j=1;j<50000000;j++)
  138.     {
  139.         a=(a*5)%maxx;
  140.         while (a%dzielnik == p%dzielnik)
  141.         {
  142.             printf("%lld %d\n",dzielnik, j);
  143.             dzielnik=dzielnik*10;
  144.         }
  145.         if (dzielnik>=maxx) break;
  146.     }
  147.  
  148.     tabela.push_back( vector<char>(2) );
  149.     tabela[0][0]=1;tabela[0][1]=6;
  150.  
  151.     for (int j=1; j<=16;j++)
  152.     {
  153.         tabela.push_back( vector<char>(2<<j) ) ;
  154.         tabela[j][0]=tabela[j-1][(1<<j)-1]/2;
  155.         for ( int i=1;i<(2<<j);i++ )
  156.         {
  157.             tabela[j][i]=tabela[j-1][(i-1)%(1<<j)]/2+ 5*(tabela[j][i-1]%2);
  158.         }
  159.     }
  160.     for (int j=0;j<100;j++){
  161.         printf("***%lld %lld\n",tabela[16][j],tabela[16][(1<<16)+j]);
  162.     };
  163.  
  164.     //wyrzucamy pierwszą liczbę
  165.     //unsigned long long p=0;
  166.     p=0;
  167.     for (int j=16;j>=0;j--)
  168.     {
  169.         p=p*10+tabela[j][0];
  170.     };
  171.     p=(p*10+2)%maxx;
  172.     p=(p*10+5)%maxx;
  173.  
  174.     printf("++++++++%llu\n",p);
  175.     a=p;
  176.     for (int i=1;i<(2<<18);i++)
  177.     {
  178.         a=(a*5)%maxx;
  179.         p=0;
  180.         for (int j=16;j>=0;j--)
  181.         {
  182.             p=p*10+tabela[j][i%(2<<j)];
  183.         };
  184.         p=(p*10+2)%maxx;
  185.         p=(p*10+5)%maxx;
  186.         if (a!=p)printf("dupa");//else printf("ok");
  187.         //printf("\n++%llu %llu\n",p,a);
  188.     }
  189.    
  190.  
  191.  
  192.     int kk=3;
  193.     for (int j=0; j<(2<<kk)+2;j++)
  194.     {
  195.         //printf("52");
  196.         for ( int i=kk-1;i>=0;i-- )
  197.         {
  198.             printf("%d",tabela[i][j%(2<<i)]);
  199.         }
  200.         printf("25\n");
  201.     }
  202.  
  203.  
  204.     vector<int> offsety(1000);
  205.  
  206.     for (int i=0;i<1000;i++)
  207.     {
  208.         a=i*1000000;
  209.         b=i*1000000+1;
  210.         int ile;
  211.         for (ile=1; ile<29; )
  212.         {
  213.             a=a*2;
  214.             b=b*2;
  215.             if (a>=1000000000) a=a/10;
  216.             if (b>=1000000000) b=b/10+1;
  217.             if ( (a>=b)|| (!( (a>527000000)||(b<521000000) )  ) ) break;
  218.             ile++;
  219.         }
  220.         offsety[i]=ile; // 2^ile
  221.         if (ile<31)printf("%03d %02d %lld %lld %lld %lld\n",i, ile, ((long long)i)<<ile, ((long long)i+1)<<ile ,a,b);
  222.     }
  223.    
  224.  
  225.     a=1;
  226.     while (a<maxx) a*=2;
  227.     a=a%maxx;
  228.     b=a;
  229.  
  230.     for (int j=1;j<10;j++)
  231.     {
  232.         a=(a*2);
  233.         b=b*2;
  234.         if (a>=maxx) a=a/10;
  235.         if (b>=maxx) b=b/10+1;
  236.         if ((a>=52100000000000000)&&(a<=52700000000000000)&&j>(1000000000-100000))
  237.          printf("%lld %d %lld ",a, j , b-a);
  238.     }
  239.  
  240.  
  241.     Cduza_liczba A(4,0, 1);
  242.     Cduza_liczba B(4,1, 1);
  243.     printf("\n");
  244.     A.wypisz();
  245.     printf("\n");
  246.     B.wypisz();
  247.     printf("\n");
  248.  
  249.     clock_t start, finish;
  250.     start = clock();
  251.  
  252.     //for (int j=0;j<100000000;j++)
  253.     //{
  254.     //  A.mnoz(1<<29);
  255.     //  B.mnoz(1<<29);
  256.     //  if (j%1000000==0)printf("%d ",j/1000000);
  257.     //}
  258.     printf("\n");
  259.     finish = clock();
  260.     printf("%lfs\n", (finish - start)/(double)CLOCKS_PER_SEC );
  261.  
  262.  
  263.  
  264.     for (int j=0;j<5;j++)
  265.     {
  266.         A.mnoz(1<<29);
  267.         B.mnoz(1<<29);
  268.  
  269.         A.wypisz();
  270.         printf("\n");
  271.         B.wypisz();
  272.         printf("\n");
  273.         printf("\n");
  274.     }
  275.  
  276.  
  277.     //--------------------wlsciwa zabawa------------------
  278.  
  279.    
  280.  
  281.     Cduza_liczba liczbaA(6,0, 1);
  282.     Cduza_liczba liczbaB(6,1, 1);
  283.     unsigned long long skrA, skrB;
  284.     printf("\n");
  285.     liczbaA.wypisz();
  286.     printf("\n");
  287.     liczbaB.wypisz();
  288.     printf("\n");
  289.    
  290.  
  291.     unsigned long long licznik=0,kolejnycel=0;
  292.  
  293.     while (liczbaA.cyfr==0)
  294.     {
  295.         licznik+=29;
  296.         liczbaA.mnoz(1<<29); //najszybciej jak to mozliwe wychpdzimy poza zakres gdy trzymamy zera wiodące
  297.         liczbaB.mnoz(1<<29);
  298.     }
  299.  
  300.     if (test(5265158745164752236)) printf("przeszedl\n"); else printf("nie przeszedfl\n");
  301.     rekord=-1;
  302.     int oldrekord=-1;
  303.     vector <unsigned long long> wyniki;
  304.  
  305.     for (/*int ii=0;ii<20;ii++*/;;){
  306.         skrA=liczbaA.przod();
  307.         skrB=liczbaB.przod();
  308.         if (skrA!=skrB) { printf("za mala dokladnosc\n");break; }
  309.         if (test( skrA ))
  310.         {
  311.             printf("hura");
  312.             wyniki.push_back(licznik);
  313.         }
  314.         if (rekord>oldrekord)
  315.         {
  316.             printf("rekord %d %llu\n",rekord+3,licznik);
  317.             oldrekord=rekord;
  318.         }
  319.         //printf("%lld\n",skrA/10000000000000000);
  320.  
  321.         int skok=offsety[ skrA/10000000000000000];
  322.         //printf("s%d\n",skok);
  323.         liczbaA.mnoz(1<<skok);
  324.         liczbaB.mnoz(1<<skok);//1<<skok
  325.         licznik+=skok;
  326.         //printf("%u \n",rekord);
  327.  
  328.         if (licznik >kolejnycel)
  329.         {// informuje o przebiegu prac. wykomentowac, jesli tylko szukamy rekordow.
  330.             printf("%llu %u %u \n",licznik/1000000,wyniki.size(),rekord);
  331.             kolejnycel+=100000000;
  332.        
  333.         }
  334.     }
  335.  
  336.    
  337.  
  338.  
  339.  
  340.  
  341.     return 0;
  342. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement