// OPERACIONES CON NUMEROS DE VARIOS DIGITOS #include <stdio.h> #include <stdlib.h> struct numero { int num; struct numero *ant; struct numero *sig; }; int longitud(struct numero *a) { int x = 0; while (a) { x++; a = a->sig; } return x; } struct numero *crea_espacio(void) { struct numero *nodo; if (!(nodo = (struct numero *) malloc(sizeof(struct numero)))) { puts("no hay memoria...\n"); return NULL; } nodo->sig = NULL; nodo->ant = NULL; return nodo; } struct numero *inv(struct numero *x) { struct numero *nodo = NULL; struct numero *ant = NULL; while(x) { nodo = crea_espacio(); nodo->num = x->num; if (!ant) {ant = nodo;} else { ant->ant = nodo; nodo->sig = ant; ant = nodo;} x = x->sig; } return ant; } struct numero *pide_numero(void) { int valor = 0; struct numero *nodo = NULL; struct numero *primero = NULL; struct numero *ant = NULL; puts("\ntermine con un -1\n"); while(valor >= 0) { scanf("%d", &valor); if (valor < 0) continue; nodo = crea_espacio(); nodo->num = valor; if (!ant) {ant = nodo; primero = nodo; } else { ant->sig = nodo; nodo->ant = ant; ant = nodo; } } return primero; } void imprime(struct numero *valor) { puts("respuesta: \n"); while(valor) { printf("%d", valor->num); valor = valor->sig; } puts("\n"); } struct numero *suma(struct numero *a, struct numero *b) { struct numero *x = NULL; struct numero *y = NULL; struct numero *salida = NULL; struct numero *nodo = NULL; struct numero *ant = NULL; int valor, long_a, long_b, acarreo = 0; div_t checa; if (!a && !b) return NULL; if (!a) return b; if (!b) return a; long_a = longitud(a); long_b = longitud(b); if (long_a > long_b) {x = inv(a); y = inv(b);} if (long_a < long_b) {x = inv(b); y = inv(a);} if (long_a == long_b) {x = inv(a); y = inv(b);} while(x) { if (!y) valor = 0; else valor = y->num; valor = x->num + valor + acarreo; checa = div(valor, 10); if (checa.rem >= 1) { acarreo = checa.quot; valor = checa.rem; } else acarreo = 0; nodo = crea_espacio(); nodo->num = valor; if (!ant) {ant = nodo; salida = nodo; } else { ant->sig = nodo; nodo->ant = ant; ant = nodo;} x = x->sig; if (y) y = y->sig; } return inv(salida); } struct numero *resta(struct numero *a, struct numero *b) { struct numero *x = NULL; struct numero *y = NULL; struct numero *salida = NULL; struct numero *nodo = NULL; struct numero *ant = NULL; int valor, long_a, long_b, acarreo = 0; int checa; if (!a && !b) return NULL; if (!a) return b; if (!b) return a; long_a = longitud(a); long_b = longitud(b); if (long_a > long_b) {x = inv(a); y = inv(b);} if (long_a < long_b) {x = inv(b); y = inv(a);} if (long_a == long_b) {x = inv(a); y = inv(b);} while(x) { if (!y) checa = 0; else checa = y->num; if (x->num > checa) { valor = x->num - checa - acarreo; acarreo = 0; } if (x->num < checa) { x->num += 10; valor = x->num - checa; acarreo = 1; } if (x->num == checa) { valor = 0; acarreo = 0; } nodo = crea_espacio(); nodo->num = valor; if (!ant) {ant = nodo; salida = nodo; } else { ant->sig = nodo; nodo->ant = ant; ant = nodo;} x = x->sig; if (y) y = y->sig; } return inv(salida); } struct numero *multi(struct numero *a, struct numero *b) { struct numero *x = NULL; struct numero *y = NULL; struct numero *k = NULL; struct numero *salida = NULL; struct numero *medio = NULL; struct numero *nodo = NULL; struct numero *ant = NULL; int valor, long_a, long_b, acarreo = 0; int shift = 0; div_t checa; long_a = longitud(a); long_b = longitud(b); if (long_a > long_b) {x = inv(a); y = inv(b);} if (long_a < long_b) {x = inv(b); y = inv(a);} if (long_a == long_b) {x = inv(a); y = inv(b);} while(y) { k = x; acarreo = 0; ant = NULL; while(k) { valor = y->num * k->num + acarreo; if (valor > 9) { checa = div(valor, 10); acarreo = checa.quot; valor = checa.rem; } else acarreo = 0; nodo = crea_espacio(); nodo->num = valor; if (!ant) {ant = nodo; medio = nodo; } else { ant->sig = nodo; nodo->ant = ant; ant = nodo;} k = k->sig; } if (acarreo) { nodo = crea_espacio(); nodo->num = acarreo; ant->sig = nodo; nodo->ant = ant; ant = nodo; } if (shift) { acarreo = shift; while(acarreo) { nodo = crea_espacio(); nodo->num = 0; nodo->sig = medio; medio->ant = nodo; medio = nodo; acarreo--; } } salida = suma(salida, medio); printf("\nva== "); imprime(salida); shift++; y = y->sig; } return inv(salida); } int menu(void) { puts("1 suma\n"); puts("2 resta\n"); puts("3 producto\n"); puts("4 factorial\n"); scanf("%d", &operador); return operador; } void main (void) { struct numero *a, *b, *c; int operador; a = pide_numero(); b = pide_numero(); if (operador == 1) c = suma(a, b); if (operador == 2) c = resta(a, b); if (operador == 3) c = multi(a, b); /* if (operador == 4) c = facto(a, b); */ imprime(c); }