Advertisement
bartekltg

podzielnosc na 2^q lustranych odbic 5^p

Jun 20th, 2011
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.24 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. int rekord;
  13.  
  14. class Cduza_liczba{
  15. public:
  16.     vector <unsigned int> dane;
  17.     int size;
  18.     static const unsigned long long baza=100000*10000;
  19.     static const int bcyfr=9;
  20.     long long cyfr;
  21.     int dodaj_zaokraglenie;
  22.     int glowa;
  23.     bool strata_cyfr;
  24.  
  25.     Cduza_liczba(int s,int d, unsigned int init)
  26.     {
  27.         size=s;
  28.         dodaj_zaokraglenie=d;
  29.         glowa=size-1;
  30.         dane=vector<unsigned int> (size,0);
  31.         dane[0]=init;
  32.         //baza=b;
  33.         strata_cyfr=false;
  34.         cyfr=0;
  35.     };
  36.     void mnoz (unsigned long long c)//dla 32bit zamienic na u.int
  37.     {
  38.         unsigned long long akumulator=0;
  39.        
  40.         int i=(glowa+1)%size;
  41.        
  42.         if (strata_cyfr)
  43.         {
  44.             akumulator=c*dodaj_zaokraglenie;
  45.             strata_cyfr=false;
  46.         }else {akumulator=0;};
  47.        
  48.         do
  49.         {
  50.             akumulator+=dane[i]*(unsigned long long)c;
  51.             dane[i]=akumulator%baza;
  52.             akumulator/=baza;
  53.             i=(i+1)%size;
  54.  
  55.         }while (i!=(glowa+1)%size);
  56.  
  57.         if (akumulator>0)
  58.         {
  59.             glowa=(glowa+1)%size;
  60.             cyfr+=bcyfr;
  61.             if (dane[glowa]>0)  strata_cyfr=true;
  62.             dane[glowa]=akumulator;
  63.         }
  64.        
  65.     };
  66.  
  67.     unsigned long long przod()
  68.     {
  69.         unsigned long long p;
  70.         int a;
  71.         int g=glowa;
  72.         while ((dane[g]==0)&& (size+g-glowa)%size!=3  ) g=(g-1+size)%size;
  73.  
  74.         p=dane[(g-1+size)%size]*baza + dane[(g-2+size)%size];
  75.         a=dane[g];
  76.        
  77.         while (a>0)
  78.         {
  79.             p=p+(a%10)*baza*baza;
  80.             a=a/10;
  81.             p=p/10;
  82.         }
  83.         return p;
  84.     }
  85.     void wypisz()
  86.     {
  87.         for (int j=0;j<size;j++)
  88.         {
  89.             printf("%09u ", dane[(glowa+size-j)%size]);
  90.         }
  91.         printf("\n %llu g:%d c:%d d:%d s:%d\n",przod(),glowa, cyfr,dodaj_zaokraglenie,strata_cyfr?1:0);
  92.     }
  93. };
  94.  
  95. unsigned long long reverse(unsigned long long x)
  96. {
  97.     unsigned long long out=0;
  98.     while (x>0)
  99.     {
  100.         out=out*10+(x%10);
  101.         x=x/10;
  102.     }
  103.     return out;
  104. }
  105.  
  106.  
  107.  
  108. int main()
  109. {
  110.     //----test
  111.    
  112.     Cduza_liczba liczbaA(5,0, 1);
  113.     Cduza_liczba liczbaB(5,1, 1);
  114.     unsigned long long skrA, skrB;
  115.     printf("\n");
  116.     liczbaA.wypisz();
  117.     printf("\n");
  118.     liczbaB.wypisz();
  119.     printf("\n");
  120.    
  121.  
  122.     unsigned long long licznik=0,kolejnycel=0;
  123.  
  124.     for (int j=1;j<=130;j++)
  125.     {
  126.        
  127.         liczbaA.mnoz(5); //najszybciej jak to mozliwe wychpdzimy poza zakres gdy trzymamy zera wiodące
  128.         liczbaB.mnoz(5);
  129.         liczbaA.wypisz();
  130.         printf("%llu\n",reverse(liczbaA.przod()));
  131.  
  132.         liczbaB.wypisz();printf("%llu\n\n",reverse(liczbaA.przod()));
  133.     }
  134.  
  135.  
  136.  
  137.     printf("------------------------\n\n");
  138.     //--------------------wlsciwa zabawa------------------
  139.     const int dokladnosc =6;
  140.  
  141.     liczbaA=Cduza_liczba (dokladnosc,0, 1);
  142.     liczbaB=Cduza_liczba (dokladnosc,1, 1);
  143.  
  144.     liczbaA.wypisz();
  145.     liczbaB.wypisz();printf("\n");
  146.  
  147.     rekord=0;
  148.     vector <unsigned long long> wyniki;
  149.  
  150.     int licz=0;
  151.     while (licz<=23)
  152.     {
  153.         skrA=liczbaA.przod();
  154.         skrB=liczbaB.przod();
  155.         if (skrA!=skrB) { printf("za mala dokladnosc\n");break; }
  156.         unsigned long long odw=reverse(skrA);
  157.         licz=0;
  158.         while ((odw%2==0)&&(odw>0))
  159.         {
  160.             licz++;
  161.             odw/=2;
  162.         }
  163.         if (licz>18) break;
  164.         if (licz>rekord)
  165.         {
  166.             rekord=licz;
  167.             printf(" %d %llu %llu\n",rekord,licznik,reverse(skrA));
  168.             //liczbaA.wypisz();
  169.         }
  170.        
  171.         liczbaA.mnoz(5);
  172.         liczbaB.mnoz(5);
  173.         licznik++;
  174.     }
  175.  
  176.     return 0;
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement