Code trừ 2 số nguyên lớn trong chuỗi bị sai kết quả

em làm code trừ 2 số nguyên lớn trong chuỗi mà hổng ra kết quả như ý muốn

http://codepad.org/P61q6nKl

#include<stdio.h>
#include<conio.h>
#include<string.h>

// thêm kí tự về vào chuỗi 
void them_ki_tu(char s[], char vtt, char ktt) {
	for (int i = strlen(s) - 1; i >= vtt; i--) {
		s[i + 1] = s[i];
	}
	s[strlen(s) + 1] = '\0';
	s[vtt] = ktt;
}

// đồng nhất độ dài của 2 chuỗi 
void dong_nhat(char s[], char s1[]) {
	// nếu chuỗi s > s1 thì lấy chuỗi s - s1,  và thêm kí tự 0 vào chuỗi ngắn nhất
	if (strlen(s) > strlen(s1)) {
		int do_dai = strlen(s) - strlen(s1);
		for (int i = 0; i < do_dai; i++) {
			// thêm kí tự vào đầu mảng 
			them_ki_tu(s1, 0, '0');
		}
	}
	else if (strlen(s1) > strlen(s)) {
		int do_dai = strlen(s1) - strlen(s);
		for (int i = 0; i < do_dai; i++) {
			// thêm kí tự 0 vào đầu mảng 
			them_ki_tu(s, 0, '0');
		}
	}
}

// trừ 2 chuỗi 
char* tru_2_chuoi(char s[], char s1[],char hieu[]) {
	dong_nhat(s, s1);
	int ket_qua = 0;
	int chi_so = 0;	
	int nho = 0;
	// duyệt từ cuối chuỗi về đầu chuỗi 
	for (int i = strlen(s) - 1; i >= 0; i--) {
		if (s[i] > s1[i]) {
			// chuyển kí tự số thành số nguyên 
			ket_qua = (s[i] - 48) - (s1[i] - 48);
			// đồi số nguyên ra chuỗi số 
			hieu[chi_so] = ket_qua + 48;
			chi_so++;
		}
		else {
			ket_qua = (s[i] - 48) - (s1[i] - 48) + 10;
			s1[i - 1] += 1;
			hieu[chi_so] = ket_qua + 48;
			chi_so++;
		}
	}
	hieu[chi_so] = '\0';
	return hieu;
}

int main() {
	char s[50]  = "2";
	char s1[50] = "4";
	char hieu[100];

	printf_s("\nTru 2 chuoi so: %s", _strrev(tru_2_chuoi(s, s1, hieu)));
	_getch();
	return 0;
}

Không như ý muốn? Cho ví dụ, có trường hợp nào đúng ý muốn không?

Nên suy nghĩ về dòng này.

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