#183 GAME sự khác nhau giữa long int và long long

Nguyễn Văn Đạt 2021-10-24 11:45:55

ở bài tập #183. GAME khi khai báo long int n,m thì kết quả là 893396834 => sai. khi khai báo long long n,m thì kết quả đúng: 250001500002 mình đã thử cho cout n,m thì cả 2 trường hợp đều giống nhau.

Tổng cộng 5 trả lời

Nguyễn Văn Đạt

À. ra vậy. Cảm ơn thầy ạ

Trùm CUỐI

Kết quả sau khi sửa đổi một chút code của bạn Nguyễn Văn Đạt

#include <bits/stdc++.h>
using namespace std;
 int main() {
	long int m, n;
	unsigned long long int kq = 0;
	cin >> n >> m;
	kq = 1ull * (m / 2) * (n / 2);
	if (m % 2) {
		kq = kq + n / 2;
		if (n % 2) kq++;
	}
	if (n % 2) {
		kq = kq + m / 2;
	} cout << kq;
}

Xem kết quả tại đây.

Trùm CUỐI
#include <bits/stdc++.h> using namespace std;
 int main() {
	long int m, n;
	unsigned long long int kq = 0;
	cin >> n >> m;
	kq = (m / 2) * (n / 2);
	if (m % 2) {
		kq = kq + n / 2;
		if (n % 2) kq++;
	}
	if (n % 2) {
		kq = kq + m / 2;
	} cout << kq;
}

Chương trình của bạn sai ở dòng 6

    kq = (m / 2) * (n / 2);

Vì khi tính toán, biểu thức ở vế phải tính xong rồi mới ép kiểu để gán cho biến kq, do đó, mọi tính toán bên vế phải là tính toán ở kiểu số nguyên 32 bit. Để tính đúng, bạn cần ép sang kiểu 64 bit để tính toán. Ví dụ:

    kq = 1ull * (m/2) * (n/2)
Nguyễn Văn Đạt

#include <bits/stdc++.h> using namespace std; int main() { long int m, n; unsigned long long int kq = 0; cin >> n >> m; kq = (m / 2) * (n / 2); if (m % 2) { kq = kq + n / 2; if (n % 2) kq++; } if (n % 2) { kq = kq + m / 2; } cout << kq; } input là: 1000001 1000003 khi m,n nhận input vẫn không tràn đúng không ạ? khi cho cout cũng vẫn đúng. kq khai báo long long rồi. mà khi tính kq lại sai. khi tính kq thì đâu có liên quan đến khai báo m,n đúng không ạ?

Trùm CUỐI
  • long int giống như long hay int là kiểu số nguyên có dấu 32 bit
  • long long là kiểu số nguyên 64 bit Bạn khai báo m, n là long int thì khi tính toán bị tràn số nên kết quả không đúng.