Bài tập về cộng trừ số lớn

Anh chị cho em hỏi với ạ.Đề bài:cho 2 số X,Y được biểu diễn như 2 xâu kí tự.Nhiệm vụ của bạn là tìm |X-Y|. Cách làm của em là chuyển từ xâu kí tự sang số rồi trừ bình thường.Anh chị e hỏi là nếu e làm như vậy thì có phù hợp với test 0<=length(x)<=10^3; 0<=length(Y)<=10^3 không ạ.Em cám ơn.Dưới là code của em

using namespace std;
int num(string num){
	int res = 0;
	for(int i = 0; i < num.length(); i++){
		res = (res * 10 + (int)num[i] - '0');
	}
	return res;
}
int main(){
	int T;
	string x, y;
	cin >> T;
	while(T--){
		cin >> x >> y;
		int numX = num(x);
		int numY = num(y);
		cout << abs(numX - numY); 
	}
}

Giá trị của số nguyên có dấu (int) chỉ lớn hơn 2 tỷ một chút (2,147,483,647). Tức là nó có khoảng 10 chữ số.
Bài toán của bạn yêu cầu số lượng chữ số tối đa là 10^3.
Không khả thi!

Cho dù dùng kiểu long long cũng không được.

5 Likes
  1. xác định số nào lớn số nào nhỏ, bằng cách đếm số chữ số, nếu bằng nhau, thì so từ đầu, tới khi có sự khác biệt sẽ phân được lớn nhỏ, nếu hên nó bằng nhau tới cuối luôn thì kết quả là 0 luôn
  2. sau khi xác định số nào lớn, số nào nhỏ, lấy số lớn trừ số nhỏ. bằng cách chuyển chuỗi thành mảng, có padding cho - số lượng 2 phần tử - của 2 mảng - bằng nhau, trừ nhau từ đơn vị ra đằng trước như mình tính bằng tay. ví dụ 123456 - 98765, thì phải đổi thành a{1,2,3,4,5,6} - b{0,9,8,7,6,5}, sắp bài toán
    1 2 3 4 5 6
  • 0 9 8 7 6 5

trừ 2 mảng y như cách mình tính bằng tay

4 Likes

Hà Mã Tím đáng yêu thấy có nhiều bạn hỏi về câu hỏi này, để tránh trùng lặp, bạn tham khảo ở đây nhé:


pseudo code cho bạn gợi ý và tránh được tình trạng copy & paste :crazy_face::crazy_face::crazy_face::crazy_face:

4 Likes

Ko cần padding :smiley: chỉ duyệt có một chiều từ bé đến lớn thôi, kết quả mới nằm trong mảng.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?