Challenge: Tìm số lớn nhất trong 5 số nguyên

Bài này mình được giao từ hồi lớp 8, đến giờ vẫn chưa giải được. Mời anh em DNH vào làm thử:

Dùng tất cả các ngôn ngữ có thể, tìm ra số lớn nhất trong 5 số nguyên. Yêu cầu:

  • Dùng ít hơn 5 lần if. Đề gốc là dùng <= 3 lần if. Mọi hình thức khác của if như
(a > b) ? a : b

đều không được chấp nhận.

  • Không được dùng vòng lặp.
  • Không dùng hàm max() hoặc min() có sẵn của ngôn ngữ lập trình bạn sử dụng.
  • Không được dùng mảng.

Hi HK boy.
Vứt mấy cái bài này đi. Thích thì chạy vòng for xếp mảng 5 phần tử.

1 Like
int MaxOf5Integers(int Input1, int Input2, int Input3, int Input4, int Input5)
{
	var InputNumbers = new System.Collections.Generic.List<int>(new int[] { Input1, Input2, Input3, Input4, Input5 });
	if (InputNumbers[0] > InputNumbers[1])
		InputNumbers.RemoveAt(1);
	else
		InputNumbers.RemoveAt(0);
	if (InputNumbers[0] > InputNumbers[1])
		InputNumbers.RemoveAt(1);
	else
		InputNumbers.RemoveAt(0);
	if (InputNumbers[0] > InputNumbers[1])
		InputNumbers.RemoveAt(1);
	else
		InputNumbers.RemoveAt(0);
	if (InputNumbers[0] > InputNumbers[1])
		InputNumbers.RemoveAt(1);
	else
		InputNumbers.RemoveAt(0);
	return InputNumbers[0];
}

Đề gốc tính sau.

1 Like

Có được phép dùng mảng và hàm sắp xếp mảng không?

Quên mất. Không được dùng mảng nhé.

Làm vui mà, đừng nghiêm túc quá :v

Hi HK boy.
Bạn ném cái if vào trong hàm rồi gọi lại hàm.

def getMax(a, b):
	if a < b:
		return b
	else :
		return a

a = 3
b = 5
c = 7
d = 0
e = 6

print(getMax(a, getMax(b, getMax(c, getMax(d, e)))))
1 Like
#include <iostream>
#include <algorithm>

int main(/*int argc, char *argv[]*/)
{
  int a = 10;
  int b = 22;

  auto maxof = [](int a, int b){
    return (abs(a - b) + (a + b)) / 2;
  };

  std::cout << maxof(a, b) << std::endl;

  return 0;
}


Cần float thì mình xài thêm Template :grin:

1 Like

Thế này khác gì 4 lần if đâu bác :v

Hi Dark.Hades.
Liệu dùng trị tuyệt đối cho cả 5 thăng được không nhỉ ?

Hi HK boy.
Thay hàm max trị truyệt đối vào. @_@!

1 Like

Hoy, hỏi số nguyên đã :v mà đây mới là 2 số mà, bác viết thêm 5 số cho đủ bộ :v

mặc dù mình biết là viết 5 số cũng tương tự thôi :v

1 Like
def get_max(a, b):
    return (a ^ ((a ^ b) & -(a < b)))

a = 3
b = 5
c = 7
d = 9
e = 6

print(get_max(a, get_max(b, get_max(c, get_max(d, e)))))
2 Likes

Không dùng if luôn:

int MaxOf2Integers(int Input1, int Input2)
{
	return (int)((Input1 + Input2 + System.Math.Abs(Input1 - Input2)) / 2);
}
int MaxOf5Integers(int Input1, int Input2, int Input3, int Input4, int Input5)
{
	return MaxOf2Integers(Input1, MaxOf2Integers(Input2, MaxOf2Integers(Input3, MaxOf2Integers(Input4, Input5))));
}
2 Likes
#include <iostream>
#include <algorithm>
#include <vector>

int main(/*int argc, char *argv[]*/)
{
  std::vector<int> a = {2,3,1,5,4};

  auto maxof = [](const std::vector<int> &a){
    int max = a.front();
    for (std::size_t i = 1; i < a.size(); i++)
    {
      max = (abs(max - a.at(i)) + (max + a.at(i))) / 2;
    }
    return max;
  };

  std::cout << maxof(a) << std::endl;

  return 0;
}


Các bác đổi thuật nhanh quá, mình viết vội cũng k kịp :grin:

Không xài mảng bác ơi :v

1 Like

Thế thôi để lát về đổi thành recursive, đọc đề k kĩ :joy:

1 Like

n số tìm max thì tối thiểu cần n-1 phép ss, ko ăn gian dc đâu

2 Likes

Chắc không chơi hàm dựng sẵn.

1 Like

Ngôn ngữ Erlang, bản thân cú pháp không có if, không for

max(A, B, C, D, E) ->
  lists:foldl(
    fun(Element, Max) when Element > Max -> Element;
      (_, Max) -> Max
    end,
    A, [B,C,D,E]).
1 Like

Dùng bitwise nhé bạn, done

int getMax(int a, int b) {
    int c = a - b;
    int k = (c >> 31) & 0x1;
    int max = a - k * c;
    return max;
}
int max_of_5 = getMax(a,getMax(b,getMax(c,getMax(d,e)))) 
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?