Đố vui giải trí cuối ngày [Bài toán vui]

nhập vào 3 số nguyên dương, xuất ra giá trị lớn nhất, giá trị nhỏ nhất.
KHÔNG dùng các cấu trúc điều kiện rẽ nhánh, không dùng sort (thực ra cũng chứa if) ,…
Nói tóm lại chỉ dùng các phép toán

6 Likes

Cái này mình quen, không biết thiếu sót gì không

#include <iostream>
using namespace std;
int SoLonNhat(int,int,int);
int SoBeNhat(int,int,int);
int main()
{
    int a=123, b=44, c=2331;
    cout << "So lon nhat trong 3 so la: " << SoLonNhat(a,b,c) << endl;
    cout << "So be nhat trong 3 so la: " << SoBeNhat(a,b,c);
}

int SoLonNhat(int a,int b,int c){
    return a*(a>b & a>c)+
           b*(b>a & b>c)+
           c*(c>a & c>b);
}
int SoBeNhat(int a,int b,int c){
    return a*(a<b & a<c)+
           b*(b<a & b<c)+
           c*(c<a & c<b);
}
4 Likes

Cái này mình làm theo trang bit-hack
https://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax

#include <iostream>
using namespace std;

int main() {
    // your code goes here
    int a, b, c;
    cin >> a >> b >> c;
    
    int min, max;
    
    max = a ^ ((b ^ a) & -(a < b));
    min = b ^ ((b ^ a) & -(a < b));
    
    max = max ^ ((c ^ max) & -(max < c));
    min = min ^ ((min ^ c) & -(c < min));
    
    cout << "Min: " << min << endl;
    cout << "Max: " << max << endl;
    
    return 0;
}
4 Likes

Không khác gì dùng điều kiện rẽ nhánh :)) Cách này có hợp lệ không

#include <stdio.h>

int cmp(int a,int b)
{
	while(a>=b) return 1;
	return 0;
}

void fun2(int a,int b,int c)
{
	while(cmp(a,b) && cmp(a,c))
	{
		printf("max = %d\n",a);
		while(cmp(b,c))
		{
			printf("min = %d\n",c);
			break;
		}
		while(cmp(c,b))
		{
			printf("min = %d\n",b);
			break;
		}
		break;
	}
}

void solution(int a,int b, int c)
{
	fun2(a,b,c);
	fun2(b,a,c);
	fun2(c,a,b);
}

int main()
{
	int m,n,t;
	scanf("%d %d %d",&m,&n,&t);
	solution(m,n,t);
}
2 Likes

:3 ghê quá :smiley: mình ko nghĩ đến cách dùng bit :))
Cũng chả biết diễn tả ý tưởng thế nào bằng code :v biết mỗi pascal :smiley:

max(a,b)= int( (a*int(a/b)+b*int(b/a) ) /( int(a/b)+int(b/a) ) )
max(a,b,c)= max(max(a,b),c)

min(a,b) = int( (a*int(b/a)+b*int(a/b) ) /( int(a/b)+int(b/a) ))
min(a,b,c)= min(min(a,b),c)

code theo tí bằng c++ mới học được cho dễ nhìn:D

 #include <iostream>
using namespace std;
int max(int a,int b){
	return (a*(a/b)+b*(b/a))/(a/b+b/a);
}
int min(int a,int b){
	return (a*(b/a)+b*(a/b))/(a/b+b/a);
}
int main(){
	int a,b,c;
	cin>>a>>b>>c;
	cout<<max(max(a,b),c);
	cout<<min(min(a,b),c);
}
1 Like

cách này của bác :frowning: đúng kiểu lách luật :v nhưng do luật không nói rõ nên đành thêm luật vậy :v cấm dùng cấu trúc vòng lặp :3

1 Like

cách này “chưa” đúng nhé bác :3 còn tại sao bác cứ từ từ sẽ ngẫm ra

1 Like

cao siêu quá :3 nhưng mà đúng :smiley:

1 Like

Em có cao kiến thế này,Các bác xem giùm

public static int Max(int a,int b)
{
	HashMap hashMap = new HashMap();
	hashMap.put(new Boolean(false), new Integer(0));
	hashMap.put(new Boolean(true), new Integer(1));
	return ((int) hashMap.get(a >= b) * a) + ((int) hashMap.get(a < b) * b);
}

public static int Max3So(int a,int b,int c)
{
	int maxab = Max(a,b);
	return Max(maxab,c);
}
2 Likes

Mình hỏi ngu phát :
Thế nếu làm được thì giải quyết được vấn đề gì ?

bác có thể giải thích cho mình 2 cái công thức return kia không? :smiley:

Int a, b, c, Max, Min;
Max = a > b ? a : b;
Min = a > b ? b : a,
Max = Max > c ? Max : c;
Min = Min > c ? c : Min?

for fun thôi mà bạn :smiley:

1 Like

à :smiley: tại vì c+ +
int a,b;
a/b mà không ép kiểu thì nó tự lấy phần nguyên luôn (khác làm tròn nhé)
ví dụ: 1/2=0; 2/3=0;1/3=0;
còn cái hàm thì chỉ để tính:
tổng các số có giá trị lớn nhất (trường hợp có 2 số bằng nhau)/ số số có giá trị lớn nhất
min thì ngược lại :slight_smile:

đây là cấu trúc điều kiện mà bạn :slight_smile:

Mình nhớ không nhầm là có công thức tính trực tiếp min, max của 3 số
mình đọc được công thức đó trên 1 trang luyện code online của brazil.

Mấy số cũng được mà bác :smiley:

tmax= a1 * [a1/a1] * [a1/a2] * [a1/a3]*...*[a1/an] + a2* [a2/a1] * [a2/a3]* ...*[a2/an]+....+ an*[an/a1]*[an/a2]*...*[an/an]
smax=[a1/a1] * [a1/a2] * [a1/a3]*...*[a1/an] + [a2/a1] * [a2/a3]* ...*[a2/an]+....+ [an/a1]*[an/a2]*...*[an/an]
max=tmax/smax

[a]: là phần nguyên của a

à ý mình hỏi là đoạn công thức ý, sao công thức đó lại tính ra đc số lớn nhất và nhỏ nhất?

à bạn thử lắp 1 số th vào cho dễ hiểu :smiley:
Rồi chia thành 2 bài toán nhỏ:
Bài 1: Cho 2 số a,b tìm số số có giá trị lớn nhất :smiley: nhìn câu hỏi có vẻ ngu nhưng cũng vui :v
TH1: a=b thì có 2 số
TH2: a#b thì có 1 số
Bài 2: Tính tổng của các giá trị lớn nhất.
TH1: a=b thì aa/b+bb/a=2a=2b;
TH2: a#b (không mất tính tổng quát giả sử a>b) thì aa/b+bb/a=a1+b0=a
p/s: Mình không giỏi giải thích :slight_smile: hi vọng bạn hiểu :bear:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?