Guest User

Untitled

a guest
May 24th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.56 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <string.h>
  5.  
  6. #define SIZE 512
  7. #define SIZED 513
  8.  
  9. #define FOR(i, n) for(i=0; i<n; i++)
  10.  
  11. typedef struct{
  12.   char l[SIZED];
  13.   char znak;
  14. } Liczba;
  15.  
  16. void drukuj(Liczba *l);
  17.  
  18. Liczba *newLiczba(){
  19.   Liczba* n=(Liczba*)malloc(sizeof(Liczba));
  20.   memset(n->l, 0, SIZED);
  21.   n->znak=1;
  22.   return n;
  23. }
  24. void resetLiczba(Liczba *l){
  25.   memset(l->l, 0, SIZED);
  26.   l->znak=1;
  27. }
  28.  
  29.  
  30. void przenies(char *s, int left){
  31.   static char c;
  32.   while(left--){
  33.     c=0;
  34.     while(s[0]>9){
  35.       s[0]-=10;
  36.       s[1]+=1;
  37.       c=1;
  38.     }
  39.     if(c)
  40.       s++;
  41.     else break;
  42.     //printf(">");
  43.   }
  44. }
  45.  
  46.  
  47. void dodaj( Liczba *l1, Liczba *l2, Liczba *w){
  48.   int i=0;
  49.   for(i=0; i<SIZE; i++){
  50.     w->l[i]+=l1->l[i]+l2->l[i];
  51.     //przenies(w->l+i, SIZE-i);
  52.     if(w->l[i]>9){
  53.       w->l[i]-=10;
  54.       w->l[i+1]+=1;
  55.     }
  56.   }
  57.   if(w->l[SIZE]==9) w->znak=-1;
  58.   else w->znak=1;
  59. }
  60.  
  61. void odejmij(Liczba *l1, Liczba *l2, Liczba *w){
  62.   int i=0;
  63.   if(l1!=w)
  64.     memcpy(w->l, l1->l, SIZED);
  65.   w->l[SIZE]=1;
  66.   for(i=0; i<SIZE; i++){
  67.     w->l[i]-=l2->l[i];
  68.     if(w->l[i]<0){
  69.       w->l[i]+=10;
  70.       w->l[i+1]-=1;
  71.     }
  72.   }
  73.   if(w->l[SIZE-1]==9) w->znak=-1;
  74.   else w->znak=1;
  75. }
  76.  
  77. void mnoz(Liczba *l1, Liczba *l2, Liczba *ww){
  78.   int i, j;
  79.   char *a=l1->l;
  80.   char *b=l2->l;
  81.   char *w=ww->l;
  82.   resetLiczba(ww);
  83.   for(i=0; i<SIZE; i++){
  84.     for(j=0; j<SIZE; j++){
  85.       przenies(w+i+j, SIZE-i);
  86.       w[i+j]+=a[i]*b[j];
  87.     }
  88.     przenies(w+i, SIZE-i);
  89.   }
  90.   //przenies(w, SIZE-i);
  91. }
  92.  
  93. int testZero(char *l){
  94.   static int i;
  95.   i=0;
  96.   if(l[SIZE]==9) return -1;
  97.   while(i<SIZE)
  98.     if(l[i++]>0)
  99.       return 1;
  100.   return 0;
  101. }
  102.  
  103. int porownaj(Liczba *l1, Liczba *l2){
  104.   char *a=l1->l+SIZE-1;
  105.   char *b=l2->l+SIZE-1;
  106.   //if(l1->znak != l2->znak) return l2->znak + 2*l1->znak;
  107.   while(a+1!=l1->l){
  108.     if(*a!=*b) return *a - *b;
  109.     a--;
  110.     b--;
  111.   }
  112.   return 0;
  113. }
  114.  
  115. void dziel(Liczba *l1, Liczba *l2, Liczba *ww){
  116.   //char *a=l1->l;
  117.   //char *b=l2->l;
  118.   char *w=ww->l;
  119.   resetLiczba(ww);
  120.   while(porownaj(l1, l2)>0){
  121.     w[0]++;
  122.     odejmij(l1,l2,l1);
  123.     przenies(w,SIZE);
  124.   }
  125. }
  126.  
  127. Liczba *tmp;
  128. void drukuj(Liczba *l){
  129.   static int i;
  130.   static char *n;
  131.   n=l->l;
  132.   i=SIZE-1;
  133.   if(l->znak>=0){
  134.     while(n[i]==0 && i>0) i--;
  135.     while(i>=0){
  136.       printf("%d", n[i]);
  137.       i--;
  138.     }
  139.     printf("\n");
  140.   }
  141.   else{
  142.     resetLiczba(tmp);
  143.     odejmij(tmp, l, tmp);
  144.     printf("-");
  145.     drukuj(tmp);
  146.   }
  147. }
  148.  
  149.  
  150. int main(int argc, char* argv[]){
  151.   int z;
  152.   tmp=newLiczba();
  153.   scanf("%d\n", &z);
  154.   Liczba *l1=newLiczba();
  155.   Liczba *l2=newLiczba();
  156.   Liczba *w=newLiczba();
  157.   char tmp[SIZE*2+10], op;
  158.   int i, j, l;
  159.   //void (*f[128])(Liczba *l1, Liczba *l2, Liczba *w);
  160.   //f['+']=dodaj;  f['-']=odejmij;  f['*']=mnoz;  f['/']=dziel;
  161.   while(z--){
  162.     resetLiczba(l1);
  163.     resetLiczba(l2);
  164.     scanf("%s", tmp);
  165.     l=strlen(tmp);
  166.     if(l<2) return 0;
  167.     j=0;
  168.     for(i=l-1; i>=0; i--){
  169.       if(tmp[i]>='0' &&  tmp[i]<='9')
  170.     l2->l[j++]=tmp[i]-'0';
  171.       else break;
  172.     }
  173.     op=tmp[i];
  174.     j=0;
  175.     for(i=i-1; i>=0; i--){
  176.       if(tmp[i]>='0' &&  tmp[i]<='9')
  177.     l1->l[j++]=tmp[i]-'0';
  178.       else break;
  179.     }
  180.     l1->znak=l2->znak=1;
  181.     resetLiczba(w);
  182.     //(*f[op])(l1,l2,w);
  183.     switch(op){
  184.       case '+': dodaj(l1, l2, w);
  185.         break;
  186.       case '-': odejmij(l1, l2, l1);
  187.         break;
  188.       case '*': mnoz(l1, l2, w);
  189.         break;
  190.       case '/': dziel(l1, l2, w);
  191.         break;
  192.     }
  193.     drukuj(w);
  194.   }
  195.   free(l1); free(l2);
  196.   return 0;
  197. }
Add Comment
Please, Sign In to add comment