ở 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.
#include<bits/stdc++.h> using namespace std;intmain(){longintm,n;unsignedlonglongintkq=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ụ:
#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 ạ?
Tổng cộng 5 trả lời
À. ra vậy. Cảm ơn thầy ạ
Kết quả sau khi sửa đổi một chút code của bạn Nguyễn Văn Đạt
Xem kết quả tại đây.
Chương trình của bạn sai ở dòng 6
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ụ:
#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 ạ?