#include #include #include //co zwracaja poszzczegolne funkcje, odwolywanie sie do tablicy w funkcjach, wczytywanie , wypisywanie, //czy tablice na poczatku oplaca sie wypelniac zerami //wypisywanie wielu zer gdy komorka 0 #define MAX(x, y) (((x) > (y)) ? (x) : (y)) unsigned int a[1100], b[1100], p[1100], k[1100], s[1100], r[1100]; /*for(int i=0;i<1100;i++){ a[i]=0; b[i]=0; p[i]=0; k[i]=0; s[i]=0; r[i]=0; if(i==s){ k[i]=1000000000; //wynik z dzielenia moze byc maksymalnie liczba a czyli dlugosc wyniku moze miec maksymalnie dlugosc pierwszej liczby } } */ unsigned long long w[2200]; char licz1[9900]; char licz2[9900]; int n,m; FILE *fp = fopen ("liczba1.txt", "r"); // liczba a FILE *fp2 = fopen ("liczba2.txt", "r"); //liczba b FILE *fp3 = fopen ("wynik.txt","w"); //liczba utworozna przy pomocy obliczen na a i b void init(*fp,*fp2) { int d1,d2; while(fgets (licz1, 9900, fp)!=NULL) // wczytywanie liczby pierwszej do licz1 i sprawdzanie jej dlugosci { d1++; } while(fgets (licz2, 9900, fp2)!=NULL) // wczytywanie liczby drugiej do licz2 i sprawdzanie jej dlugosci { d2++; } n=(d1/9)+1; //ilosc komorek w tablicach a i b; m=(d2/9)+1; unsigned int b; //pomocnicze trzymanie komorki z tablicy a int c; // 10^j; for(int i=0; i liczba2 if(n>m || a[n-1]>b[n-1]) { //odejmowanie kazdej komorki jak w odejmowaniu slupkowym for(int i=0; ib[i]) { w[i]=a[i]-b[i]; } else // jesli komorka liczby1 jest mniejsza od komorki z liczby2 zapozyczamy z kolejnej //komorki liczby1 jedynke i dodajemy jej wartosc do aktualnej komorki { a[i+1]=a[i+1]-1; a[i]=a[i]+1000000000; w[i]=a[i]-b[i]; } } } else // jesli liczba ktora chcemy odjac jest wieksza od liczby od ktorej odejmujemy // zamieniamy je miejscami a wynik wypisujemy z minusem { for(int i=0; ia[i]) { w[i]=b[i]-a[i]; } else // jesli komorka liczby2 jest mniejsza od komorki z liczby1 zapozyczamy z kolejnej //komorki liczby2 jedynke i dodajemy jej wartosc do aktualnej komorki { b[i+1]=b[i+1]-1; b[i]=b[i]+1000000000; w[i]=b[i]-a[i]; } } // !printf -? } } void mult() { //maxs wieksza z dlugosci liczb int rozmiar=maxs; // dlugosc podzielonej liczby na dwie czesci // int potega = 10^n; unsigned int liczbaa1[rozmiar]; // pierwsza czesc liczby a unsigned int liczbaa2[rozmiar]; // druga czesc liczbya unsigned int liczbab1[rozmiar]; // pierwsza czesc liczby b unsigned int liczbab2[rozmiar]; // druga czesc liczby b unsigned long long karatsuba(unsigned int a[],unsigned int b[]) { if(rozmiar==1) { liczba1*liczba2 } if(rozmiar%2==0) { rozmiar=rozmiar/2; } else { rozmiar=(rozmiar/2) +1 } for(int i=0; i0 // k-> 10^(n-m) //gdy liczba2 jest wieksza od liczby1 to sie w niej nie miesci wiec wynik dzielenia to 0, a reszta jest cala liczba1 if(m>n) { w->0 //r->liczba1 for(int i=0;i<1100){ r[i]=a[i]; } } //inaczej binary search w poszukiwaniuw yniku z dzielenia else { //dopoki poczatek mniejszy od konca while(p[]<=k[]) { srodek=(p+k)/2 if((srodek*b)a) { k= srodek -1 } else { //wynik z dzielenia nie ma reszty wiec //w=k; for(int i=0;i<1100;i++){ w[i]=k[i]; } } } //w znaleziona najwieksza liczbap taka ze p*b>a for(int i=0;i<1100;i++){ w[i]=p[i]; } //reszta z dzielenia r=a-(w*b); } } void save(*fp3) { //x rozmiar tablicy w for(int i=x; i>=0; i--) { //if(w[i]!=NULL) //trzeba zachowac 9 cyfr w liczbie fprintf(fp3,"%llu",w[i]) } }