Ultra-large number multiplication

xiaoxiao2021-03-06  79

#include

#include

#include

#include

#include

Typedef int et;

Typedef struct node {

ET DATA;

Struct node * p;

Struct node * n;

} Node, * nodeh;

Typedef struct list {

Nodeh head;

Nodeh End;

Int length;

} List, * lisith;

Inline Bool Initlist (Listh & L)

{

// Turn the head node L

L = (LISTH) Malloc (SizeOf (list));

ASSERT (L);

L-> Head = l-> end = null;

L-> Length = 0;

Return True;

}

Inline Nodeh Nmalloc (Const et & elem)

{

// Return a new node, its data is ELEM

Nodeh Temp = (Nodeh) Malloc (Sizeof (Node));

Assert (TEMP);

Temp-> Data = ELEM;

Return Temp;

}

Inline Bool Preadd (Listh & L, Const et & elem)

{

/ / Add new node ELEM on the head

Nodeh Temp = Nmalloc (ELEM);

(l-> length);

IF (null == l-> Head && null == L-> End) {

Temp-> n = TEMP-> P = NULL;

L-> Head = l-> end = TEMP;

Return True;

}

Temp-> P = NULL;

Temp-> n = l-> head;

L-> Head-> p = TEMP;

L-> Head = Temp;

Return True;

}

Inline Bool Endadd (Listh & L, Const et & elem)

{

// Add new node ELEM at the end

Nodeh Temp = Nmalloc (ELEM);

(l-> length);

IF (null == l-> Head && null == L-> End) {

Temp-> n = TEMP-> P = NULL;

L-> Head = l-> end = TEMP;

Return True;

}

TEMP-> n = null;

Temp-> p = l-> end;

L-> end-> n = TEMP;

L-> End = Temp;

Return True;

}

Inline Bool DestoryList (Listh & L)

{

// Release Table 1

Nodeh Temp = L-> Head, IT;

IF (temp == null) {

Free (l);

Return True;

}

While (Temp! = L-> End) {

IT = TEMP;

Temp = Temp-> N;

Free (it);

}

Free (TEMP);

Free (l);

Return True;

}

Inline void printlist (listh & l) {

//print

Nodeh it = l-> head, end = l-> end;

IF (it == null) return;

For (; it! = end; it = it-> n)

Putchar (It-> Data '0');

Putchar (It-> Data '0');

}

Inline Bool Addzero (Listh & L, Int Count)

{

// Plus COUNT 0 in the tail of L

While (count -) endadd (l, 0);

Return True;

}

Inline Bool Bitmul (Listh & Num)

{

// Deposit L and Number multiplied the result in Num

// NUM should be empty! ! ! ! ! ! ! ! !

Nodeh L_END = L-> End;

Int status = 0, TEMP;

For (; l_end! = l-> head; l_end = l_end-> p) {

Temp = l_end-> data * number status;

Preadd (NUM, TEMP% 10);

Status = TEMP / 10;

}

Temp = l-> Head-> data * number status;

IF (TEMP> 10) {

Preadd (NUM, TEMP% 10);

Preadd (NUM, TEMP / 10);

}

Else Preadd (NUM, TEMP);

// Less one time :)

Return True;

}

Inline Bool Add (Const Listh & La, Listh & lb)

{

// lb = la lb

Nodeh pa = la-> end, pb = lb-> end;

INT status = 0;

For (; pa! = la-> head; pa = pa-> p, pb = pb-> p) {

IF (PB == NULL) {

Preadd (lb, 0);

Pb = lb-> head;

}

Int sum = pa-> data pb-> data status;

IF (SUM> = 10) {

PB-> DATA = SUM% 10;

STATUS = 1;

}

Else {

PB-> DATA = SUM;

STATUS = 0;

}

}

IF (PB == NULL) {

Preadd (lb, 0);

Pb = lb-> head;

}

Int sum = pa-> data pb-> data status;

IF (SUM> = 10) {

PB-> DATA = SUM% 10;

IF (PB-> P == null) {

Preadd (lb, 0);

Pb = lb-> head;

PB-> DATA = SUM / 10;

Return True;

}

PB = Pb-> P;

IF (PB == NULL) {

Preadd (lb, 0);

Pb = lb-> head;

}

PB-> DATA = SUM / 10;

Return True;

}

ELSE // sum <10pb-> data = sum;

Return True;

}

///

Inline void Mul (const char * a, const char * b)

{

// init

Listh cs = null; // multiplier

Listh bcs = null; // is multiplied

Listh num = null; //

Assert (A && B);

Assert (Initlist (NUM));

Assert (Initlist (CS) && InitList (BCS);

{

// symbol processing

INT SIG = 1;

IF ('-' == * a) {

a;

SIG * = - 1;

}

ELSE IF (' ' == * a) A;

IF ('-' == * b) {

b;

SIG * = - 1;

}

ELSE IF (' ' == * b) B;

IF (SIG <0) PUTCHAR ('-');

}

IF (strcmp (a, b)> 0) {

Const char * pa = a, * pb = b;

For (; '/ 0'! = * Pa; Pa) {

INT TEMP = * PA-'0 ';

ASSERT (Endadd (BCS, TEMP));

}

For (; '/ 0'! = * pb; pb) {

INT TEMP = * PB-'0 ';

ASSERT (Endadd (CS, TEMP));

}

}

Else {

Const char * pa = a, * pb = b;

For (; '/ 0'! = * Pa; Pa) {

INT TEMP = * PA-'0 ';

ASSERT (Endadd (CS, TEMP));

}

For (; '/ 0'! = * pb; pb) {

INT TEMP = * PB-'0 ';

ASSERT (Endadd (BCS, TEMP));

}

}

// init end !!!!

Nodeh CS_P = CS-> END;

INT bit = 0; // digit

For (; cs_p! = cs-> head; cs_p = cs_p-> p) {

Listh Temp;

Initlist (TEMP);

Bitmul (BCS, CS_P-> DATA, TEMP);

///

PUTS ("================================================ ================== / n ");

PrintList (BCS); ///

Printf ("X% D =", CS_P-> DATA);

PrintList (TEMP);

///

// <======================================= h !!!!!!!!!!!!!!!! !!!!!!!!!!!!!! Addzero (TEMP, BIT);

Add (TEMP, NUM);

/

PUTS ("/ nnum:");

PrintList (NUM);

Printf ("/ nbit:% d / n", bit);

bit;

DestoryList (TEMP);

}

Listh Temp;

Initlist (TEMP);

Bitmul (BCS, CS_P-> DATA, TEMP);

///

Puts ("=============================================== ================== / n ");

PrintList (BCS); ///

Printf ("X% D =", CS_P-> DATA);

PrintList (TEMP);

///

// <======================================= h !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!

Adzero (Temp, Bit);

Add (TEMP, NUM);

/

PUTS ("/ nnum:");

PrintList (NUM);

Printf ("/ nbit:% d / n", bit);

///

Std :: cout << '/ n' << "Result =";

PrintList (NUM);

PUTCHAR ('/ n');

/// Clean up work

DestoryList (TEMP);

DestoryList (BCS);

DestoryList (CS);

DestoryList (NUM);

}

Int main (void)

{

Std :: string a, b;

Std :: cin >> a;

Std :: cin >> b;

Mul (A.c_STR (), B.C_STR ());

System ("pause");

Return 0;

}

转载请注明原文地址:https://www.9cbs.com/read-88883.html

New Post(0)