Câu trả lời của Sparky là một cách tiêu chuẩn để giải quyết vấn đề này, nhưng như tôi cũng đã viết trong bình luận của mình, bạn có nguy cơ bị tràn. Điều này có thể được giải quyết bằng cách sử dụng loại rộng hơn, nhưng nếu bạn muốn chia long long
s thì sao?
Câu trả lời của Nathan Ernst cung cấp một giải pháp, nhưng nó liên quan đến một lệnh gọi hàm, khai báo biến và điều kiện, làm cho nó không ngắn hơn mã OP và thậm chí có thể chậm hơn, vì khó tối ưu hóa hơn.
Giải pháp của tôi là thế này:
q = (x % y) ? x / y + 1 : x / y;
Nó sẽ nhanh hơn một chút so với mã OP, bởi vì modulo và phép chia được thực hiện bằng cách sử dụng cùng một lệnh trên bộ xử lý, bởi vì trình biên dịch có thể thấy rằng chúng tương đương nhau. Ít nhất gcc 4.4.1 thực hiện tối ưu hóa này với cờ -O2 trên x86.
Về lý thuyết, trình biên dịch có thể thực hiện lệnh gọi hàm trong mã của Ern Ernst và phát ra điều tương tự, nhưng gcc đã không làm điều đó khi tôi kiểm tra nó. Điều này có thể là do nó sẽ buộc mã được biên dịch thành một phiên bản duy nhất của thư viện chuẩn.
Như một lưu ý cuối cùng, không có gì trong số này quan trọng trên một máy hiện đại, ngoại trừ nếu bạn đang ở trong một vòng lặp cực kỳ chặt chẽ và tất cả dữ liệu của bạn nằm trong các thanh ghi hoặc bộ đệm L1. Mặt khác, tất cả các giải pháp này sẽ nhanh như nhau, ngoại trừ khả năng của Nathan Ernst, có thể chậm hơn đáng kể nếu chức năng phải được lấy từ bộ nhớ chính.
q = x/y + (x % y != 0);
là đủ