Advertisement
bartekltg

Lepsza 2^p|L(5^q)

Jun 21st, 2011
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.63 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <cstdio>
  3. #include <intrin.h>
  4. #include <vector>
  5. #include <ctime>
  6. #include <cmath>
  7.  
  8. using namespace std;
  9.  
  10. int rekord;
  11.  
  12. class Cduza_liczba{
  13. public:
  14.     vector <unsigned int> dane;
  15.     int size;
  16.     static const unsigned long long baza=100000*10000;
  17.     static const int bcyfr=9;
  18.     long long cyfr;
  19.     int dodaj_zaokraglenie;
  20.     int glowa;
  21.     bool strata_cyfr;
  22.  
  23.     Cduza_liczba(int s,int d, unsigned int init)
  24.     {
  25.         size=s;
  26.         dodaj_zaokraglenie=d;
  27.         glowa=size-1;
  28.         dane=vector<unsigned int> (size,0);
  29.         dane[0]=init;
  30.         //baza=b;
  31.         strata_cyfr=false;
  32.         cyfr=0;
  33.     };
  34.     void mnoz (unsigned long long c)//dla 32bit zamienic na u.int
  35.     {
  36.         unsigned long long akumulator=0;
  37.        
  38.         int i=(glowa+1)%size;
  39.        
  40.         if (strata_cyfr)
  41.         {
  42.             akumulator=c*dodaj_zaokraglenie;
  43.             strata_cyfr=false;
  44.         }else {akumulator=0;};
  45.        
  46.         do
  47.         {
  48.             akumulator+=dane[i]*(unsigned long long)c;
  49.             dane[i]=akumulator%baza;
  50.             akumulator/=baza;
  51.             i=(i+1)%size;
  52.  
  53.         }while (i!=(glowa+1)%size);
  54.  
  55.         if (akumulator>0)
  56.         {
  57.             glowa=(glowa+1)%size;
  58.             cyfr+=bcyfr;
  59.             if (dane[glowa]>0)  strata_cyfr=true;
  60.             dane[glowa]=akumulator;
  61.         }
  62.        
  63.     };
  64.  
  65.     unsigned long long przod()
  66.     {
  67.         unsigned long long p;
  68.         int a;
  69.         int g=glowa;
  70.         while ((dane[g]==0)&& (size+g-glowa)%size!=3  ) g=(g-1+size)%size;
  71.  
  72.         p=dane[(g-1+size)%size]*baza + dane[(g-2+size)%size];
  73.         a=dane[g];
  74.        
  75.         while (a>0)
  76.         {
  77.             p=p+(a%10)*baza*baza;
  78.             a=a/10;
  79.             p=p/10;
  80.         }
  81.         return p;
  82.     }
  83.     void vprzod(vector<char> &V)
  84.     {
  85.         V.clear();
  86.         int g=(glowa+1)%size;
  87.        
  88.         int stopg=glowa;
  89.         while (dane[stopg]==0) stopg=(stopg-1+size)%size;
  90.  
  91.         while (stopg != g)
  92.         {
  93.             //printf("%d%d\n",g,stopg);
  94.             int a=dane[g];
  95.             for (int i=0;i<9;i++)
  96.             {
  97.                 V.push_back(a%10);
  98.                 a=a/10;
  99.             }
  100.             g=(g+1)%size;
  101.             //printf("blabla");
  102.         }
  103.        
  104.         int a=dane[g];
  105.         while(a>0)
  106.         {
  107.             V.push_back(a%10);
  108.             a=a/10;
  109.         }
  110.  
  111.     }
  112.  
  113.  
  114.     void wypisz()
  115.     {
  116.         for (int j=0;j<size;j++)
  117.         {
  118.             printf("%09u ", dane[(glowa+size-j)%size]);
  119.         }
  120.         printf("\n %llu g:%d c:%d d:%d s:%d\n",przod(),glowa, cyfr,dodaj_zaokraglenie,strata_cyfr?1:0);
  121.     }
  122. };
  123.  
  124. unsigned long long reverse(unsigned long long x)
  125. {
  126.     unsigned long long out=0;
  127.     while (x>0)
  128.     {
  129.         out=out*10+(x%10);
  130.         x=x/10;
  131.     }
  132.     return out;
  133. }
  134.  
  135.  
  136. int powaznytest(vector<char> &va, vector<char> &vb)
  137. {
  138.     if (va.size()!=vb.size()) return -1;
  139.    
  140.     unsigned long long koncowka=0, waga=1;  //wszystko mod (2^64);
  141.     int j=0;
  142.     int size =va.size();
  143.    
  144.     do{
  145.         j++;
  146.         koncowka+=((unsigned long long)va[size-j])*waga;
  147.         if ( va[size-j]!=vb[size-j] ) return -1;
  148.         waga=waga*10;
  149.     }while (((koncowka% ( ((unsigned long long)1) <<j )) ==0 ) && (j<=64)  );
  150.     return j-1;
  151.  
  152. }
  153.  
  154. unsigned long long p10(int x)
  155. {
  156.     unsigned long long r=1;
  157.     for (;x>0;x--)
  158.         r=r*10;
  159.     return r;
  160. }
  161.  
  162.  
  163. int main()
  164. {
  165.     //----test
  166.    
  167.     Cduza_liczba liczbaA(7,0, 1);
  168.     Cduza_liczba liczbaB(7,1, 1);
  169.     unsigned long long skrA, skrB;
  170.     printf("\n");
  171.     liczbaA.wypisz();
  172.     printf("\n");
  173.     liczbaB.wypisz();
  174.     printf("\n");
  175.    
  176.  
  177.     unsigned long long licznik=0,kolejnycel=0;
  178.  
  179.     vector<char> V;
  180.  
  181.     for (int j=1;j<=10;j++)
  182.     {
  183.        
  184.         liczbaA.mnoz(5); //najszybciej jak to mozliwe wychpdzimy poza zakres gdy trzymamy zera wiodące
  185.         liczbaB.mnoz(5);
  186.         liczbaA.wypisz();
  187.         printf("%llu\n",reverse(liczbaA.przod()));
  188.         liczbaB.wypisz();
  189.         printf("%llu\n",reverse(liczbaA.przod()));
  190.         liczbaA.vprzod(V);
  191.         printf("\ntest: ");
  192.         for (int j=V.size()-1;j>=0;j--) printf("%d",V[j]);
  193.         printf("\n\n");
  194.     }
  195.  
  196.  
  197.  
  198.     printf("------------------------\n\n");
  199.     //--------------------wlsciwa zabawa------------------
  200.     const int dokladnosc =7;
  201.  
  202.     liczbaA=Cduza_liczba (dokladnosc,0, 1);
  203.     liczbaB=Cduza_liczba (dokladnosc,1, 1);
  204.  
  205.     liczbaA.wypisz();
  206.     liczbaB.wypisz();printf("\n");
  207.  
  208.     rekord=0;
  209.     vector <unsigned long long> wyniki;
  210.     vector<char> va,vb;
  211.     int licz=0;
  212.     while (licz<=63)
  213.     {
  214.         skrA=liczbaA.przod();
  215.         skrB=liczbaB.przod();
  216.         if (skrA!=skrB) { printf("za mala dokladnosc\n");break; }
  217.         unsigned long long odw=reverse(skrA);
  218.         licz=0;
  219.         while ((odw%2==0)&&(odw>0))
  220.         {
  221.             licz++;
  222.             odw/=2;
  223.         }
  224.         if (licz>=17)
  225.         {
  226.            
  227.             liczbaA.vprzod(va);
  228.             liczbaB.vprzod(vb);
  229.             licz = powaznytest(va,vb);
  230.  
  231.         }
  232.        
  233.         if (licz==-1){ printf("za mala dokladnosc w powaznym tescie\n"); return 0;}
  234.  
  235.         if (licz>rekord)
  236.         {
  237.             rekord=licz;
  238.            
  239.             if (licz>=17)
  240.             {
  241.                 printf("r %d %llu ",rekord,licznik);
  242.                 for (int j=va.size()-1;j>=va.size()-licz;j--) printf("%d",va[j]);
  243.                 printf("\n");
  244.             }else
  245.                 printf("r %d %llu %llu\n",rekord,licznik,reverse(skrA) %p10(licz));
  246.  
  247.         }
  248.        
  249.         liczbaA.mnoz(5);
  250.         liczbaB.mnoz(5);
  251.         licznik++;
  252.     }
  253.     printf("OK\n");
  254.     return 0;
  255. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement