30/09/2018, 19:47

Đố 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

Huy viết 22:00 ngày 30/09/2018

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);
}
... viết 21:49 ngày 30/09/2018

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;
}
Toan Tran viết 22:03 ngày 30/09/2018

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);
}
X viết 21:54 ngày 30/09/2018
stackoverflow.com
Microsoft Developer

Find maximum of three number in C without using conditional statement and ternary operator

c, algorithm, conditional-statements
asked by Microsoft Developer on 05:38AM - 16 Aug 11
Ai Android viết 22:00 ngày 30/09/2018
:3 ghê quá :D 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);
}
Ai Android viết 21:52 ngày 30/09/2018

cách này của bác đú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

Ai Android viết 21:58 ngày 30/09/2018

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

Ai Android viết 21:57 ngày 30/09/2018

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

viết 22:00 ngày 30/09/2018

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);
}
Văn Dương viết 21:58 ngày 30/09/2018

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

Tiến Hoàng viết 21:49 ngày 30/09/2018

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

Khang LÊ Minh viết 21:59 ngày 30/09/2018

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?

Ai Android viết 21:58 ngày 30/09/2018

for fun thôi mà bạn

Ai Android viết 21:48 ngày 30/09/2018

à 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

Ai Android viết 22:01 ngày 30/09/2018

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

minh tiến viết 21:47 ngày 30/09/2018

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.

Tú Anh Hoàng viết 21:58 ngày 30/09/2018
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
Tiến Hoàng viết 21:52 ngày 30/09/2018

à ý 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?

Ai Android viết 21:58 ngày 30/09/2018

à bạn thử lắp 1 số th vào cho dễ hiểu
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 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 hi vọng bạn hiểu

Bài liên quan
0