Thao tác với dữ liệu Big Numbers _Lập trình C++ căn bản

Giới thiệu:

  Trong lập trình, đôi khi chúng ta sẽ phải thao tác với các con số "cực khủng", khoảng vài chục, vài trăm, vài nghìn chữ số, thậm chí nhiều hơn nữa. trong khi đó, C++ chỉ hỗ trợ cho chúng ta những kiểu float, int, double,...và chắc chắn là không thể chứa được các con số cực khủng đó. Do đó, người lập trình phải nghĩ ra những cách khôn ngoan khác để làm điều này, sẽ có nhiều giải pháp được đưa ra, ở đây mình chỉ mới nghĩ được cách dùng danh sách liên kết kép để chứa từng số của từng chữ, chắc chắn là chưa tối ưu rồi, và với các con số lên đến vài triệu chữ số thì giải pháp này là không khả thi (bộ nhớ máy không đủ để chứa hết các số đó), lúc này các bạn lại phải nghĩ ra những cách khác, điều đó phụ thuộc và trí tưởng tượng của bạn. Tuy nhiên, trong phạm vi bài viết này, mình đưa ra giải pháp này nhằm chia sẻ với các bạn đang học lập trình C++, các bạn có thể lấy đây làm tài liệu tham khảo cho các bài tập trên lớp.
  ở đoạn code dưới đây, mình code để giải đề bài sau:

Yêu cầu: Lần lượt nhập 2 nguyên dương có độ dài bất kỳ. Tiến hành cộng 2 số đó.
Kết thúc việc nhập 1 số nguyên dương khi gặp số “99”
Ví dụ: 71 + 68 = 139. Được minh họa ở Input và Output

INPUT
OUTPUT
7
1
99
6
8
99
1
3
9

Temp Code:
 đây là giải pháp của bản thân, các bạn có thể sẽ có cách hay hơn!
//author: Tạ Tạ

#include<iostream>
using namespace std;
struct Node
{
int  Key;
Node*Next;
Node*Pre;
Node()  
{
this->Next = NULL;
this->Pre = NULL;
}                          
};
struct List
{
Node*Head;
Node*Tail;
List(){ this->Head = this->Tail = NULL; }
void addTail(int x)
{
Node* P = new Node;
P->Key = x;
if (!this->Head)
{
this->Head = this->Tail = P;
}
else
{
this->Tail->Next = P;
this->Tail = P;
}
}
void addHead(int x)
{
Node* P = new Node;
P->Key = x;
if (!this->Head)
{
this->Head = this->Tail = P;
}
else
{
P->Next = this->Head;
this->Head = P;
}
}
int getLength()
{
int Count = 0;
for (Node*P = this->Head; P; P = P->Next) Count++;
return Count;
}
~List()
{
Node*P = this->Head;
Node*Temp = this->Head;
while (P)
{
Temp = P;
P = P->Next;
delete[]Temp;
}
}
};
void add(List&A, List&B)
{
int LengthA = A.getLength();
int LengthB = B.getLength();
int Distance = (LengthA- LengthB);
if (Distance<0) Distance = -Distance;
if (LengthA >LengthB)
{
for (int i = 0; i < Distance; i++)
{
B.addTail(0);
}
}
else
{
for (int i = 0; i < Distance; i++)
{
A.addTail(0);
}
}
int Length = (LengthA>LengthB) ? LengthA : LengthB;
int SignBit=0;
Node*PA = A.Head;
Node*PB = B.Head;
int Temp;
int Container[5000];   //creat new array to contain Sum
int Count = 0;
for (int i=0; i < Length-1; i++)
{
Temp = (SignBit + PA->Key + PB->Key);
Container[Count++] = Temp % 10;
if (Temp >= 10) SignBit = 1;
else SignBit = 0;
PA = PA->Next;
PB = PB->Next;
}
int FinalBit= (PA->Key + PB->Key + SignBit);
/*cout << FinalBit % 10;*/
Container[Count++] = FinalBit % 10;
FinalBit = FinalBit / 10;
if (FinalBit) /*cout << FinalBit;*/
Container[Count++] = FinalBit;
for (int j = Count - 1; j >= 0; j--)
{
cout << Container[j];
}
}
int main()
{
List A;
List B;
int x=0;
for (; x != 99;)
{
cin >> x;
if (x != 99) A.addHead(x);
}
x = 0;
for (; x != 99;)
{
cin >> x;
if (x != 99) B.addHead(x);
}
add(A, B);
return 0;
}

Comments

Popular posts from this blog

Duyệt cây nhị phân theo chiều rộng _Lập trình C++

Duyệt cây không dùng đệ quy và stack _Lập trình C++ căn bản

Bài toán Upper Bound và Lower Bound trên cây nhị phân tìm kiếm