Skip to content

Instantly share code, notes, and snippets.

@cuongdev
Created June 11, 2016 17:43
Show Gist options
  • Save cuongdev/3a5108258a58f41ac8284057b31e23a4 to your computer and use it in GitHub Desktop.
Save cuongdev/3a5108258a58f41ac8284057b31e23a4 to your computer and use it in GitHub Desktop.
Big number in linked list C++
#include <iostream>
#include <string.h>
using namespace std;
struct NODE
{
int data;
NODE *pNext, *pPred;
}; typedef struct NODE NODE;
typedef struct
{
NODE *pHead, *pTail;
}LIST;
void Init(LIST &L)
{
L.pHead = L.pTail = NULL;
}
template <class T>
NODE *CreateNode(T &x)
{
NODE *newnode = new NODE;
if (newnode == NULL) //Khong du bo nho cap phat
return NULL;
newnode->data = x;
newnode->pNext = NULL;
newnode->pPred = NULL;
return newnode;
}
void AddHead(LIST &L, NODE *p)
{
if (L.pHead == NULL)
{
L.pHead = L.pTail = p;
return;
}
else
{
p->pNext = L.pHead;
L.pHead->pPred = p;
L.pHead = p;
}
}
void AddTail(LIST &L, NODE *p)
{
if (L.pHead == NULL)
{
L.pHead = L.pTail = p;
}
else
{
L.pTail->pNext = p;
p->pPred = L.pTail;
L.pTail = p;
}
}
void DisplayHead(LIST L)
{
if (L.pHead == NULL)
return;
for (NODE *p = L.pHead; p != NULL; p = p->pNext)
cout << p->data;
}
void DeleteHead(LIST &L)
{
if (L.pHead == NULL)
return;
else if (L.pHead == L.pTail)
{
delete L.pHead;
Init(L);
}
else
{
NODE *p = L.pHead;
L.pHead = L.pHead->pNext;
delete p;
}
}
int Count(LIST L)
{
int count = 0;
if (L.pHead == NULL)
return count;
for (NODE *p = L.pHead; p != NULL; p = p->pNext)
count++;
return count;
}
void Nhap2Chuoi(LIST &L, LIST &L2, char s[100], char s2[100])
{
cout << "\nNhap So Thu Nhat:";
fflush(stdin);
gets(s);
cout << "\nNhap So Thu Hai:";
fflush(stdin);
gets(s2);
for (int i = 0; i < strlen(s); i++)
{
int temp = s[i] - 48;
NODE *p = CreateNode(temp);
AddTail(L, p);
}
for (int i = 0; i < strlen(s2); i++)
{
int temp2 = s2[i] - 48;
NODE *q = CreateNode(temp2);
AddTail(L2, q);
}
}
void Nhap1Chuoi(LIST &L, char s[100])
{
cout << "\nNhap So:";
fflush(stdin);
gets(s);
for (int i = 0; i < strlen(s); i++)
{
int temp = s[i] - 48;
NODE *p = CreateNode(temp);
AddTail(L, p);
}
}
void CanBangChuSo(LIST &L, LIST &L2)
{
int k = 0, x = 0;
int CountL = Count(L), CountL2 = Count(L2);
if (CountL > CountL2)
{
k = CountL - CountL2;
for (int i = 0; i < k; i++)
{
NODE *p = CreateNode(x);
AddHead(L2, p);
}
}
if (CountL2 > CountL)
{
k = CountL2 - CountL;
for (int i = 0; i < k; i++)
{
NODE *q = CreateNode(x);
AddHead(L, q);
}
}
}
void XoaSo0Du(LIST &L)
{
if (L.pHead->data != 0)
return;
if (L.pHead->pNext == NULL)
return;
while (L.pHead->data == 0)
{
DeleteHead(L);
if (L.pHead->pNext == NULL)
return;
}
}
LIST TinhTong(LIST L, LIST L2)
{
LIST Tong;
Init(Tong);
int nho = 0, x;
NODE *z;
CanBangChuSo(L, L2);
for (NODE *p = L.pTail, *q = L2.pTail;; p = p->pPred, q = q->pPred)
{
int temp = (p->data) + (q->data) + nho;
nho = temp / 10;
x = temp % 10;
z = CreateNode(x);
AddHead(Tong, z);
if (q == L2.pHead)
break;
}
if (nho != 0)
{
z = CreateNode(nho);
AddHead(Tong, z);
}
return Tong;
}
LIST operator+(LIST L, LIST L2)
{
LIST kq;
Init(kq);
kq = TinhTong(L, L2);
return kq;
}
int SoSanh2So(LIST L, LIST L2)
{
CanBangChuSo(L, L2);
for (NODE *p = L.pHead, *q = L2.pHead; p != NULL; p = p->pNext, q = q->pNext)
{
if (p->data > q->data) // Ket luan So Thu 1 > So Thu 2
return 1;
else if (p->data < q->data) //Ket luan So Thu 2 > So Thu 1
return 2;
}
return 0; // 2 so bang nhau
}
LIST TinhHieu(LIST L, LIST L2)
{
CanBangChuSo(L, L2);
LIST Hieu;
Init(Hieu);
int nho = 0, x;
NODE *z;
for (NODE *p = L.pTail, *q = L2.pTail;; p = p->pPred, q = q->pPred)
{
int temp = (p->data) - (q->data) - nho;
if (temp < 0)
{
temp += 10;
nho = 1;
}
else
{
nho = temp / 10;
}
x = temp % 10;
z = CreateNode(x);
AddHead(Hieu, z);
if (q == L2.pHead)
break;
}
XoaSo0Du(Hieu);
return Hieu;
}
LIST operator-(LIST L, LIST L2)
{
LIST kq;
Init(kq);
kq = TinhHieu(L, L2);
return kq;
}
void RemoveList(LIST &L)
{
if (L.pHead == NULL)
return;
while (L.pHead != NULL)
{
NODE *p = L.pHead;
L.pHead = L.pHead->pNext;
delete p;
}
Init(L);
}
LIST TinhTich(LIST L, LIST L2)
{
int x, ZERO = 0, k, k2 = 0;
NODE *z;
LIST Tich, Sum;
Init(Tich);
Init(Sum);
z = CreateNode(ZERO);
AddHead(Sum, z);
if (Count(L) > Count(L2))
k = Count(L);
else
k = Count(L2);
for (NODE *q = L2.pTail;; q = q->pPred)
{
int nho = 0;
for (NODE*p = L.pTail;; p = p->pPred)
{
int temp = (p->data) * (q->data) + nho;
nho = temp / 10;
x = temp % 10;
z = CreateNode(x);
AddHead(Tich, z);
if (p == L.pHead)
break;
}
if (nho != 0)
{
z = CreateNode(nho);
AddHead(Tich, z);
}
for (int i = 1; i <= k; i++)
{
z = CreateNode(ZERO);
AddHead(Tich, z);
}
for (int j = 0; j < k2; j++)
{
z = CreateNode(ZERO);
AddTail(Tich, z);
}
k--;
k2++;
Sum = Sum + Tich;
RemoveList(Tich);
if (q == L2.pHead)
break;
}
XoaSo0Du(Sum);
return Sum;
}
LIST operator*(LIST L, LIST L2)
{
LIST kq;
Init(kq);
kq = TinhTich(L, L2);
return kq;
}
LIST Thuong(LIST L, LIST L2)
{
int x = 1;
NODE *z;
LIST Temp, thuong;
Init(Temp);
Init(thuong);
for (NODE *p = L.pHead; p != NULL; p = p->pNext)
{
int x = p->data;
int count = 0;
z = CreateNode(x);
AddTail(Temp, z);
while (SoSanh2So(Temp, L2) != 2)
{
Temp = Temp - L2;
count++;
}
z = CreateNode(count);
AddTail(thuong, z);
}
XoaSo0Du(thuong);
return thuong;
}
LIST operator/(LIST L1, LIST L2)
{
return Thuong(L1, L2);
}
LIST TinhLuyThua(LIST L, int somu)
{
LIST luythua;
int ONE = 1;
NODE *z;
Init(luythua);
z = CreateNode(ONE);
AddHead(luythua, z);
for (int i = 0; i < somu; i++)
{
luythua = luythua * L;
}
return luythua;
}
LIST TinhGiaiThua(LIST L)
{
int ONE = 1;
LIST gt, k;
Init(gt);
Init(k);
NODE *z;
z = CreateNode(ONE);
AddHead(gt, z);
AddHead(k, z);
while (SoSanh2So(L, k) != 2)
{
gt = gt * L;
L = L - k;
}
return gt;
}
int main()
{
system("color 0a");
int somu, chon;
LIST L, L2;
char s[100], s2[100];
Init(L);
Init(L2);
LIST T, Tich, H, Thuong, LuyThua, GiaiThua;
do{
system("cls");
cout << "\t\t|______________COPYRIGHT TUAN NGUYEN______________|\n";
cout << "\t1.Tinh Tong 2 Chuoi So Nguyen Duong \n\n";
cout << "\t2.Tinh Hieu 2 Chuoi So Nguyen Duong\n\n";
cout << "\t3.Tinh Tich 2 Chuoi So Nguyen Duong\n\n";
cout << "\t4.Tinh Thuong 2 Chuoi So Nguyen Duong\n\n";
cout << "\t5.Tinh Luy Thua Chuoi So Nguyen Duong\n\n";
cout << "\t6.Tinh Giai Thua Chuoi So Nguyen Duong\n\n";
cout << "\t7.Ket thuc\n";
cout << "Moi Ban Chon:\n";
cin >> chon;
switch (chon)
{
case 1:
{
Nhap2Chuoi(L, L2, s, s2); CanBangChuSo(L, L2); T = L + L2;
cout << "\nTong = "; DisplayHead(T); RemoveList(L); RemoveList(L2); system("pause"); break;
}
case 2:
{
Nhap2Chuoi(L, L2, s, s2); CanBangChuSo(L, L2);
if (SoSanh2So(L, L2) == 1 || SoSanh2So(L, L2) == 0)
{
H = L - L2; if (Count(H) == 0) cout << "Hieu = 0"; else cout << "\nHieu = ";
}
else if (SoSanh2So(L, L2) == 2)
{
H = L2 - L; if (Count(H) == 0) cout << "Hieu = 0"; else cout << "\nHieu = - ";
}
DisplayHead(H); RemoveList(L); RemoveList(L2); system("pause"); break;
}
case 3:
{
Nhap2Chuoi(L, L2, s, s2); CanBangChuSo(L, L2); Tich = L * L2;
cout << "\nTich = ";
if (Count(Tich) == 0)
cout << "0";
else
DisplayHead(Tich); RemoveList(L); RemoveList(L2); system("pause"); break;
}
case 4:
{
Nhap2Chuoi(L, L2, s, s2); CanBangChuSo(L, L2); Thuong = L / L2;
cout << "\nThuong = ";
DisplayHead(Thuong); system("pause"); RemoveList(L); RemoveList(L2); break;
}
case 5:
{
Nhap1Chuoi(L, s);
do
{
cout << "\nNhap Vao So Mu De Tinh Luy Thua:";
cin >> somu;
if (somu < 0)
cout << "Nhap So Mu >=0!\n";
} while (somu < 0); LuyThua = TinhLuyThua(L, somu); cout << "\n So Thu Nhat ^ " << somu << " = ";
DisplayHead(LuyThua); system("pause"); RemoveList(L); break;
}
case 6:
{
cout << "Nhap n:\n"; Nhap1Chuoi(L, s); GiaiThua = TinhGiaiThua(L);
cout << "n! = "; DisplayHead(GiaiThua); system("pause"); RemoveList(L); break;
}
}
}
while (chon != 7);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment