01/10/2018, 11:20

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 diễn đàn 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.
Tao Không Ngu. viết 13:23 ngày 01/10/2018

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

Trần Hoàn viết 13:23 ngày 01/10/2018
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.

Vô Thin viết 13:21 ngày 01/10/2018

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

HK boy viết 13:22 ngày 01/10/2018

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

Vứt mấy cái bài này đi.

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

Tao Không Ngu. viết 13:32 ngày 01/10/2018

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)))))
Dark.Hades viết 13:31 ngày 01/10/2018
#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;
}

wandbox.org

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

#include #include 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


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

HK boy viết 13:35 ngày 01/10/2018

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

Tao Không Ngu. viết 13:32 ngày 01/10/2018

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

Tao Không Ngu. viết 13:21 ngày 01/10/2018

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

HK boy viết 13:23 ngày 01/10/2018

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

Henry viết 13:24 ngày 01/10/2018
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)))))
Trần Hoàn viết 13:33 ngày 01/10/2018

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))));
}
Dark.Hades viết 13:35 ngày 01/10/2018
#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;
}

wandbox.org

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

#include #include #include int main(/*int argc, char *argv[]*/) { std::vector a = {2,3,1,5,4}; auto maxof = [](const std::vector &a){ int max = a.fr


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

HK boy viết 13:32 ngày 01/10/2018

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

Dark.Hades viết 13:36 ngày 01/10/2018

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

viết 13:36 ngày 01/10/2018

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

Văn Dương viết 13:23 ngày 01/10/2018

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

Hung viết 13:30 ngày 01/10/2018

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]).
Minh Hoàng viết 13:30 ngày 01/10/2018

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)))) 
Trần Hoàn viết 13:29 ngày 01/10/2018

Mặc dù đọc phép toán bit không hiểu gì nhưng vẫn like

Bài liên quan
0