Mình có 1 đoạn code nhỏ:
int main()
{
long long n;
cin>>n;
cout<<n*(n-1)*(n-2)/6;
}
Nếu mình đổi n thành int n thì mình nhận giá trị rác khi nhập vào 1 số lớn (như 2000). Cho mình hỏi như vậy cout sẽ cho kết quả dựa theo biến?
Mình có 1 đoạn code nhỏ:
int main()
{
long long n;
cin>>n;
cout<<n*(n-1)*(n-2)/6;
}
Nếu mình đổi n thành int n thì mình nhận giá trị rác khi nhập vào 1 số lớn (như 2000). Cho mình hỏi như vậy cout sẽ cho kết quả dựa theo biến?
Trả lời câu hỏi của title: Không.
Code của bạn lỗi không phải do cout, mà là do bạn đặt kiểu dữ liệu sai.
Kết quả của phép tính phụ thuộc vào kiểu của các biến tham gia.
Nếu bạn đặt n là int, thì phép tính n*(n-1)*(n-2) của bạn sẽ nhân các số kiểu int với nhau và cho ra kết quả kiểu int.
n = 2000 (int) -> phép tính = 2000 * 1999 * 1998 > 2^31-1 => kết quả sẽ bị tràn số, sau đó chia 6 vẫn ra 1 số tràn toé loe. Thực ra nếu bạn biết 2000 * 1999 * 1998 / 6 < 2^31-1 cũng chẳng làm được gì, C++ tính từ trái sang phải và số đã tràn ở chỗ phép nhân 3 số rồi.
Nhưng nếu để n là long long, kết quả của phép tính nhân 3 số (và dĩ nhiên cả phép chia) vẫn trong khoảng giới hạn của biến.
Tức là phép toán biến long long sẽ cho ra kết quả long long đúng không ạ?
Về cơ bản là vậy. Nhưng nếu bạn tự dưng thích viết
cout << 1*2*3/6.0f << endl;
thì kết quả sẽ có kiểu float.
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?