01/10/2018, 00:42
Xin ý tưởng bài toán?
Nhập vào 3 số, tìm và in ra số lớn nhất sử dụng cấu trúc if dạng đủ(if … else)(không đc sử dụng if lồng hay gì khác).
Bài liên quan
Nhập vào 3 số, tìm và in ra số lớn nhất sử dụng cấu trúc if dạng đủ(if … else)(không đc sử dụng if lồng hay gì khác).
Yeah, cu post va cu hy vong la se co nguoi tra loi. Nhu hoi xua a cung hay hy vong co thang nao cho copy bai de qua mon Roi ra truong that nghiep nhe.
em chỉ xin ý tưởng thôi mà, có nhờ giải giúp đâu, làm gì có ai giỏi tới mức cái gì cũng biết để mà tự học, anh hy vọng có ai cho chép bài để qua môn là vì trong quá trình học anh k hỏi những gì anh thắc mắc nên anh chả biết gì mà thi
Mình thấy cũng dễ mà
Bạn so sánh số thứ nhất và số thứ hai trước, xem số nào lớn hơn thì lưu vô 1 biến riêng.
Tiếp tục so sánh số vừa tìm được với số thứ 3 là tìm được số lớn nhất thôi
Nghĩ số siếc chi cho nó mệt, nghĩ vậy nè, nếu trong nhà có 3 người, thì người cao nhất trong 3 người là người như thế nào?
Chia sẻ cho bạn, có 2 cách:
Cách 1: sử dụng câu lệnh
if
:Ý tưởng:
max
là biến lưu giá trị của biến có giá trị lớn nhất trong 3 biếna, b, c
.a
ban đầu chomax
.b > max
thì gán giá trị của b cho max, nếuc > max
thì gán giá trị củac
chomax
.max
ra màn hình.Theo ví dụ trên:
Nhập
a
= 9,b
= 6,c
= 10Gán
a
chomax
, thìmax
= 9.Tiếp theo, so sánh
b
vớimax
, tức là so sánh 6 với 9, 6 < 9, nên bỏ qua, vìmax > b
.Tiếp theo, so sánh
c
vớimax
,max
lúc này vẫn bằng 9,c
= 10 >max
, nên gán 10 chomax
.Vậy cuối cùng
max
= 10.Bonus thêm cho bạn.
Cách 2: Sử dụng công thức tổng hiệu của toán lớp 4 (không cần sử dụng
if
)Code:
Thuật toán:
a
vàb
trước,c
tính sau.a
vàb
theo công thức trên, mình gán nó lại vàoa
, giá trị cũ sẽ bị đè lên (làm như vậy bạn đỡ phải khai báo thêm một biến tạm).c
. Áp dụng lại công thức ở trên, tìm được số lớn nhất trong 3 số.Theo ví dụ trên:
a
= 111,b
= 999,c
= 10.a
vàb
là 999, gán 999 choa
c
, 999 là số lớn hơn, gán lại vàoc
.c
ra màn hình, được 999.P/s: Hàm
abs
(viết tắt chữ absolute) lấy giá trị tuyệt đối để tránh trường hợp hiệu ra số âm, dẫn đến kết quả sai.Chúc bạn học tốt
cái công thức tổng hiệu lỡ bị tràn số thì sao, ví dụ a=1.5 tỷ, b=1.6 tỷ thì a+b ra số âm rồi…
Kiểu
int
trong C có kích thước là 2 bytes, vậy giá trị của nó dao động từ -32768 đến 32767, bạn nhập 1.5 tỷ được hả?kiểu int 16 bit thì bạn đang ở năm 1980 hay 1970?
mà 16 bit thì nhập 20000 với 30000 thì tổng hiệu cũng chết. Công thức toán thì đúng nhưng áp dụng cho máy tính thì ko đúng. Xài so sánh được rồi vẽ thêm cách khác chi cho khổ.
cái bài 3 dòng code này mà cũng cần ý tưởng thì chịu .
Mà mấy bài toán swap, tìm min max… tránh dùng mấy cái bitwise, cộng trừ thì càng tốt, vừa gây khó hiểu cho người đọc code, vừa dễ lỗi lại không nhanh bằng cách thông thường ( vì compiler không tối ưu đc)
À bạn có thể dùng ternary operator, thật chất thì vẫn là if else thôi như sau:
max = (a,b,c) => a>b && a > c ? a : b > c ? b : c
Mình cũng vừa mới học lập trình thôi. Mình vừa kiểm tra lại đúng là kiểu int 4 bytes, và đây là sai sót của mình. Cảm ơn bạn đã đóng góp ý kiến. Nhưng bạn nói mình vẽ vời thì mình không đồng ý.
Thứ 1: Không có thuật toán nào là tốt nhất! Cách sử dụng if phải khai báo thêm một biến nữa, vậy là bộ nhớ tốn thêm 4 bytes, nhưng nó giải quyết được vấn đề tràn bộ nhớ. Bài sử dụng tổng hiệu thì không giải quyết được vấn đề bạn nói (hoạt động tốt với số nhỏ) nhưng nó không cần khai báo thêm biến phụ.
Thứ 2: Bạn chủ thớt cần xin ý tưởng bài toán. Ý tưởng thì có nhiều, nên mình muốn cho bạn đó coi nhiều cách làm khác nhau, để bạn đó có thể đánh giá cái nào là phù hợp nhất. Cách sử dụng if mình thấy rất nhiều và phổ biến rồi, thử nhiều cách cũng tốt, làm rập khuôn quá cũng không được.
P/S: NẾU BẮT LỖI TRÀN SỐ THÌ BÀI NÀO CŨNG BẮT ĐƯỢC HẾT!!!
nè vậy cho đơn giản nè :))
if (n1 < n2) && (n1 < n3)
if (n2 < n3) && (n2 < n1)
if (n3 < n1) && (n3 < n2)
printf bạn tự xử nhé :))
cách này không dùng biến trung gian nhé :))
đúng rồi, bài nào cũng bắt lỗi tràn số được hết. Nhưng bài này tìm số lớn nhất thì so sánh 2 lần là xong làm gì có lỗi tràn số. Tạo ra lỗi tràn số thì là vấn đề của “thuật toán”. Thuật toán nào cũng có ưu điểm nhược điểm. Thích tìm tòi cái mới thì phải tìm hiểu thêm lý do tại sao ko ai xài cái thuật toán đó nữa (nhược điểm của thuât toán đó).
với lại hàm
abs
bản thân nó cũng có chứaif
ở trỏng, thành ra vẫn xài 2 if, làm gì có chuyện ko cần sử dụng if ở đây.ngoài ra còn 1 lỗi cực kì ít gặp khi xài abs nữa. Đó là abs(INT_MIN) = INT_MIN. Vd int là 4 bytes thì abs(-231) = -231, vì int 4 byte chỉ chứa giá trị nguyên dương lớn nhất là (231 - 1). Vì vậy nếu cho a=-230, b=230, ta sẽ có a + b = 0, abs(a-b) = abs(-231) = -231, chia 2 được -230 = a, sai vì b > a.
đẻ ra lỗi tùm lum chứ đâu phải áp dụng toán học vào code là chuyện dễ