Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <string.h>
- #define SIZE 512
- #define SIZED 513
- #define FOR(i, n) for(i=0; i<n; i++)
- typedef struct{
- char l[SIZED];
- char znak;
- } Liczba;
- void drukuj(Liczba *l);
- Liczba *newLiczba(){
- Liczba* n=(Liczba*)malloc(sizeof(Liczba));
- memset(n->l, 0, SIZED);
- n->znak=1;
- return n;
- }
- void resetLiczba(Liczba *l){
- memset(l->l, 0, SIZED);
- l->znak=1;
- }
- void przenies(char *s, int left){
- static char c;
- while(left--){
- c=0;
- while(s[0]>9){
- s[0]-=10;
- s[1]+=1;
- c=1;
- }
- if(c)
- s++;
- else break;
- //printf(">");
- }
- }
- void dodaj( Liczba *l1, Liczba *l2, Liczba *w){
- int i=0;
- for(i=0; i<SIZE; i++){
- w->l[i]+=l1->l[i]+l2->l[i];
- //przenies(w->l+i, SIZE-i);
- if(w->l[i]>9){
- w->l[i]-=10;
- w->l[i+1]+=1;
- }
- }
- if(w->l[SIZE]==9) w->znak=-1;
- else w->znak=1;
- }
- void odejmij(Liczba *l1, Liczba *l2, Liczba *w){
- int i=0;
- if(l1!=w)
- memcpy(w->l, l1->l, SIZED);
- w->l[SIZE]=1;
- for(i=0; i<SIZE; i++){
- w->l[i]-=l2->l[i];
- if(w->l[i]<0){
- w->l[i]+=10;
- w->l[i+1]-=1;
- }
- }
- if(w->l[SIZE-1]==9) w->znak=-1;
- else w->znak=1;
- }
- void mnoz(Liczba *l1, Liczba *l2, Liczba *ww){
- int i, j;
- char *a=l1->l;
- char *b=l2->l;
- char *w=ww->l;
- resetLiczba(ww);
- for(i=0; i<SIZE; i++){
- for(j=0; j<SIZE; j++){
- przenies(w+i+j, SIZE-i);
- w[i+j]+=a[i]*b[j];
- }
- przenies(w+i, SIZE-i);
- }
- //przenies(w, SIZE-i);
- }
- int testZero(char *l){
- static int i;
- i=0;
- if(l[SIZE]==9) return -1;
- while(i<SIZE)
- if(l[i++]>0)
- return 1;
- return 0;
- }
- int porownaj(Liczba *l1, Liczba *l2){
- char *a=l1->l+SIZE-1;
- char *b=l2->l+SIZE-1;
- //if(l1->znak != l2->znak) return l2->znak + 2*l1->znak;
- while(a+1!=l1->l){
- if(*a!=*b) return *a - *b;
- a--;
- b--;
- }
- return 0;
- }
- void dziel(Liczba *l1, Liczba *l2, Liczba *ww){
- //char *a=l1->l;
- //char *b=l2->l;
- char *w=ww->l;
- resetLiczba(ww);
- while(porownaj(l1, l2)>0){
- w[0]++;
- odejmij(l1,l2,l1);
- przenies(w,SIZE);
- }
- }
- Liczba *tmp;
- void drukuj(Liczba *l){
- static int i;
- static char *n;
- n=l->l;
- i=SIZE-1;
- if(l->znak>=0){
- while(n[i]==0 && i>0) i--;
- while(i>=0){
- printf("%d", n[i]);
- i--;
- }
- printf("\n");
- }
- else{
- resetLiczba(tmp);
- odejmij(tmp, l, tmp);
- printf("-");
- drukuj(tmp);
- }
- }
- int main(int argc, char* argv[]){
- int z;
- tmp=newLiczba();
- scanf("%d\n", &z);
- Liczba *l1=newLiczba();
- Liczba *l2=newLiczba();
- Liczba *w=newLiczba();
- char tmp[SIZE*2+10], op;
- int i, j, l;
- //void (*f[128])(Liczba *l1, Liczba *l2, Liczba *w);
- //f['+']=dodaj; f['-']=odejmij; f['*']=mnoz; f['/']=dziel;
- while(z--){
- resetLiczba(l1);
- resetLiczba(l2);
- scanf("%s", tmp);
- l=strlen(tmp);
- if(l<2) return 0;
- j=0;
- for(i=l-1; i>=0; i--){
- if(tmp[i]>='0' && tmp[i]<='9')
- l2->l[j++]=tmp[i]-'0';
- else break;
- }
- op=tmp[i];
- j=0;
- for(i=i-1; i>=0; i--){
- if(tmp[i]>='0' && tmp[i]<='9')
- l1->l[j++]=tmp[i]-'0';
- else break;
- }
- l1->znak=l2->znak=1;
- resetLiczba(w);
- //(*f[op])(l1,l2,w);
- switch(op){
- case '+': dodaj(l1, l2, w);
- break;
- case '-': odejmij(l1, l2, l1);
- break;
- case '*': mnoz(l1, l2, w);
- break;
- case '/': dziel(l1, l2, w);
- break;
- }
- drukuj(w);
- }
- free(l1); free(l2);
- return 0;
- }
Add Comment
Please, Sign In to add comment