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).

Huy Le viết 02:50 ngày 01/10/2018

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.

Phan Vũ viết 02:43 ngày 01/10/2018

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

Nguyễn Tấn Khoa viết 02:52 ngày 01/10/2018

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

*grab popcorn* viết 02:59 ngày 01/10/2018

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?

viết 02:52 ngày 01/10/2018

Chia sẻ cho bạn, có 2 cách:
Cách 1: sử dụng câu lệnh if:

#include <stdio.h>
int main(void) {
	int a, b, c, max;
	printf("Nhap a, b, c: ");
	scanf("%d%d%d", &a, &b, &c);
	max = a;
	if (b > max) max = b;
	if (c > max) max = c;
	printf("%d\n", max);
	return 0;
}

Ý tưởng:

  • max là biến lưu giá trị của biến có giá trị lớn nhất trong 3 biến a, b, c.
  • Gán giá trị của a ban đầu cho max.
  • Nếu b > max thì gán giá trị của b cho max, nếu c > max thì gán giá trị của c cho max.
  • Sau cùng in max ra màn hình.
    Theo ví dụ trên:
    Nhập a = 9, b = 6, c = 10
    Gán a cho max, thì max = 9.
    Tiếp theo, so sánh b với max, 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ới max, max lúc này vẫn bằng 9, c = 10 > max, nên gán 10 cho max.
    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)

Số lớn = (tổng + hiệu) / 2
Số bé = (tổng - hiệu) / 2

Code:

#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
	int a, b, c;
	printf("Nhap a, b, c: ");
	scanf("%d%d%d", &a, &b, &c);
	a = (a + b + abs(a - b)) / 2;
	c = (a + c + abs(a - c)) / 2;
	printf("%d\n", c);
	return 0;
}

Thuật toán:

  • Lúc đầu, mình sẽ tìm giá trị lớn nhất của 2 số ab trước, c tính sau.
  • Tìm số lớn trong 2 số ab theo công thức trên, mình gán nó lại vào a, 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).
  • Sau đó mình sẽ tìm số lớn hơn giữa số lớn hồi nãy vừa tìm và c. Áp dụng lại công thức ở trên, tìm được số lớn nhất trong 3 số.
  • In kết quả ra màn hình.
    Theo ví dụ trên:
  • Nhập a = 111, b = 999, c = 10.
  • Áp dụng công thức tìm được số lớn trong 2 số ab là 999, gán 999 cho a
  • Áp dụng công thức lần nữa để tìm số lớn trong 2 số 999 và c, 999 là số lớn hơn, gán lại vào c.
  • In 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
viết 02:54 ngày 01/10/2018

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…

viết 02:48 ngày 01/10/2018

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ả?

viết 02:54 ngày 01/10/2018

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ổ.

cdxf viết 02:53 ngày 01/10/2018

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

viết 02:49 ngày 01/10/2018

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!!!

Nguyễn Thành Trung viết 02:45 ngày 01/10/2018

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é :))

viết 02:48 ngày 01/10/2018

đú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ứa if ở 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ễ

Bài liên quan
0