Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void add_or_take(int a, LongN * A){
- char * s;
- if(a == 1){
- A->n++;
- s = (char *)calloc(A->n, sizeof(char));
- memcpy(s, A->dig, A->n*sizeof(char));
- *(s+A->n-1) = 0;
- free(A->dig);
- A->dig = s;
- }else{
- *(A->dig + A->n - 1) = 0;
- A->n--;
- s = (char *)calloc(A->n, sizeof(char));
- memcpy(s, A->dig, A->n*sizeof(char));
- free(A->dig);
- A->dig = s;
- }
- return;
- }
- LongN divide_two(LongN a){
- LongN A;
- A.n = a.n;
- A.dig = (char *)calloc(A.n, sizeof(char));
- A.sign = a.sign;
- memcpy(A.dig, a.dig, sizeof(char)*A.n);
- int c;
- int ost = 0;
- for(int i = 0; i < A.n; i++){
- c = *(A.dig + A.n - i - 1) % 2;
- *(A.dig + A.n - i - 1) = (100*ost + *(A.dig + A.n - i - 1))/2;
- ost = c;
- }
- if(*(A.dig + A.n - 1) == 0){
- add_or_take(0, &A);
- }
- return A;
- }
- LongN times_two(LongN a){
- LongN A;
- int ost = 0;
- int c;
- A.n = a.n + 1;
- A.dig = (char *)calloc(A.n, sizeof(char));
- A.sign = a.sign;
- memcpy(A.dig, a.dig, sizeof(char)*A.n);
- for(int i = 0; i < A.n - 1; i++){
- c = ((A.dig[i] * 2) + ost) / 100;
- A.dig[i] = ((A.dig[i] * 2) + ost) % 100;
- ost = c;
- }
- if(ost == 1){
- A.dig[A.n - 1] = 1;
- }else{
- add_or_take(0, &A);
- }
- return A;
- }
- LongN sum_dig(LongN A, LongN B){
- LongN result;
- int c;
- int ostatok = 0;
- int * k;
- if(A.n > B.n){
- result.n = A.n + 1;
- result.dig = (char *)calloc(result.n, sizeof(char));
- for(int i = 0; i < B.n; i++){
- result.dig[i] = B.dig[i];
- }
- for(int i = 0; i < A.n; i++){
- result.dig[i+1] += (result.dig[i] + A.dig[i])/100;
- result.dig[i] = (result.dig[i] + A.dig[i])%100;
- }
- }else if(B.n > A.n){
- result.n = B.n + 1;
- result.dig = (char *)calloc(result.n, sizeof(char));
- for(int i = 0; i < A.n; i++){
- result.dig[i] = A.dig[i];
- }
- for(int i = 0; i < B.n; i++){
- result.dig[i+1] += (result.dig[i] + B.dig[i])/100;
- result.dig[i] = (result.dig[i] + B.dig[i])%100;
- }
- }else{
- result.n = A.n + 1;
- result.dig = (char *)calloc(result.n, sizeof(char));
- for(int i = 0; i < A.n; i++){
- result.dig[i+1] += (result.dig[i] + A.dig[i] + B.dig[i])/100;
- result.dig[i] = (result.dig[i] + A.dig[i] + B.dig[i])%100;
- }
- }
- if(result.dig[result.n-1] == 0){
- add_or_take(0, &result);
- }
- return result;
- }
- LongN multLN(LongN a, LongN b){
- int iter = 0;
- int ost;
- LongN result;
- result.dig = (char *)calloc(1, sizeof(char));
- result.sign = (a.sign + b.sign) % 2;
- result.n = 1;
- result.dig[0] = 0;
- if(a.n >= b.n){
- while((b.n != 1 || b.dig[0] != 0) && b.n != 0){
- ost = *(b.dig) % 2;
- b = divide_two(b);
- if(ost == 1){
- result = sum_dig(result, a);
- }
- /*printf("----------------------------\n");
- printf("iteration: %d\n", iter);
- printf("ost: %d\n", ost);
- printover(&a);
- printover(&b);
- printover(&result);
- printf("----------------------------\n");*/
- a = times_two(a);
- iter++;
- }
- }else{
- while((a.n != 1 || a.dig[0] != 0) && a.n != 0){
- ost = *(a.dig) % 2;
- a = divide_two(a);
- if(ost == 1){
- result = sum_dig(result, b);
- }
- /*printf("----------------------------\n");
- printf("iteration: %d\n", iter);
- printf("ost: %d\n", ost);
- printover(&a);
- printover(&b);
- printover(&result);
- printf("----------------------------\n");*/
- b = times_two(b);
- iter++;
- }
- }
- result.sign = (a.sign + b.sign) % 2;
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment