Algorithm compare 2 số nguyên

Em đang có một bài toán compare 2 số a và b không được dùng if else switch case ,loop, array.Em nghĩ mãi mà vẫn chưa bao quát hết đc các trường hợp, mong mọi người giúp đỡ, em cảm ơn ạ
Đầu vào 2 số a và b

  • Nếu a đứng trước b trong quan hệ thứ hạng thì xuất ra 1

  • Nếu a và b bằng nhau trong quan hệ thứ hạng thì xuất ra 0

  • Nếu b đứng trước a trong quan hệ thứ hạng thì xuất ra -1

Ví dụ:
a = 4, b = 5 -> output 1
a = 5, b = 5 -> output 0
a = 5, b = 4 -> output -1

1 Like

Có 3 trường hợp thôi mà :thinking: Bạn đã nghĩ được gì rồi?

5 Likes

Bạn tự nghĩ ra đề bài à ? Cái đề bài bạn viết là không dùng tới các hàm toán học, if else switch case ,loop, array, ...
Điều kiện giới hạn mà bạn lại đi chấm ba chấm thì sao mọi người biết được là cái gì được dùng, cái gì không cho dùng.
Với lại không cho dùng hàm toán học thì mình dùng phép toán số học thôi.:upside_down_face:

6 Likes

à mình nhầm, được dùng các hàm toán học và mình cũng nghĩ ra rồi, cảm ơn mọi người

1 Like

Đảm bảo pass tất cả giới hạn luôn, kể cả … :sunglasses:

#include <iostream>

int compare(int a, int b) {
    std::cout << a << " = or < or > " << b << ":\n";
    std::cout << a << " > " << b << ". Choose -1\n";
    std::cout << a << " = " << b << ". Choose  0\n";
    std::cout << a << " < " << b << ". Choose  1\n";
    
    int answer;
    std::cin >> answer;
    return answer;
}
5 Likes

@One_Debug_6hours không biết bạn có thể share solution bạn nghĩ ra cho mọi người tham khảo được không?

4 Likes

ahihi

int compare(int a, int b) {
    return (b-a) / abs(b-a);
}
2 Likes

compare(0, 0) dính lỗi rồi bác.

3 Likes

uk k phải chỉ compare(0, 0) mà a = b là lỗi

3 Likes
int compare(int a, int b) {
   return (b-a) / (abs(b-a)+1);
}
3 Likes

Không cần include gì luôn nè

int compare(int a, int b) {
    int x = 4*(a < b) + 2*(a > b) + (a == b);
    return (2*x*x -9*x + 7) / 3;
}
7 Likes

Nếu được dùng toán tử so sánh thì mình có thể sử dụng toán tử 3 ngôi:

int compare(const int& a, const int& b)
{
    return a > b ? 1 : ( a == b ? 0 : -1);
}
3 Likes

toán tử 3 ngôi là rút gọn của if else mà

2 Likes

Đây là solution của mình pass được all case. Không được dùng if else, loop, array, toán tử 3 ngôi. Này là bài thi hôm trước ở trường mình

int compare(int a, int b)
    {
        return -(a-b)*1.0 / ( abs(a-b) - 0.1 );
    }
2 Likes

Các số nguyên bất kì á bác, ví dụ a = 5 và b = -7

-1,0/0.9 = -1,1 (Không phải -1 nhá)
Nếu có phải thêm 1 lần ép kiểu.
Tôi thấy khá phức tạp, mất công chuyển sang kiểu số thực rồi lại ép kiểu về số nguyên. Dĩ nhiên đó cũng là 1 cách. Nhưng ở trên tôi thấy có cách có lẽ là hợp lý hơn.

2 Likes

Chỉ có 3 trường hợp là lớn hơn, nhỏ hơn, hoặc bằng, bạn định coi bao nhiêu số nguyên thì có từng đó trường hợp sao :v

1 Like

compare(0, -2147483648) ra 0 nè :V :V :V
compare(1, -2147483648) ra 1 V

lấy a-b là lỗi tràn số.
lấy abs là lỗi abs(-231) = -231 :V

3 Likes
int compare(int a, int b)
{
    int c = a - b;
    int d = b - a;
    int e =  (c & 0x80000000)>> 31; // phụ thuộc vào sizeof int 
    int f = (d & 0x80000000) >> 31; // phụ thuộc vào sizeof int 
   return = f-e;
}

giải thích:
nếu a < b => c < 0 & d > 0 => e = 1 & f = 0 => f - e = -1 ;
nếu a > b => c > 0 & d < 0 => e = 0 & f = 1 => f - e = 1 ;
nếu a = b => c = 0 & d = 0 => e = 0 & f = 0 => f - e = 0 ;

2 Likes

-1.5 tỷ bé hơn 1.5 tỷ nhưng -1.5 tỷ - 1.5 tỷ có < 0 đâu :V

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