Kiểm tra chia hết mà không so sánh

Input

  • Hai số nguyên dương a và b
    0 < a, b < 1000

Output

  • 0, nếu a không chia hết cho b
  • 1, nếu a chia hết cho b

ví dụ

  • Input 21 7
  • Output: 1

mọi người giúp em làm theo phép dịch bit với ạ, em định dùng dịch bit để xét bit dấu mà mãi không ra :((

1 Like

:sweat:

Sao cậu lại cần phép dịch bit thay vì check (a % b == 0)? :sweat_smile:
Và cậu đã thử xét bit dấu như thế nào rồi? Cho tớ coi code được không? :sweat_smile:

8 Likes

dạ ý em định xét (a%b) -1 nếu chia hết thì nó sẽ mang dấu âm dịch bit thì sẽ ra 1 rồi lật bit ạ . còn nếu dư thì nó sẽ dương khi dịch bit ra 0 . em nghĩ thế nhưng code nó toàn lỗi ạ :sweat_smile:

1 Like

Nhiều khi nhìn code dịch bit cũng k hiểu. Hình như nó là dấu & hay sao ấy

& ở chỗ nào ạ :sweat_smile:

Hở? :smile:
Ý tớ là, có vấn đề gì với code này không cậu? :smile:

    int a = 21, b = 7;

    if(a % b == 0) {
        printf("1\n");
    } else {
        printf("0\n");
    }
5 Likes

Nếu làm thuần tuý bài này bằng bitwise thì bài này khá hay đấy chứ.

a, b < 1000 nên 1 số a, b không dài quá 10 bit. Ký hiệu b|a tức là a chia hết cho b.

Đặt a = 2^m \cdot x, b = 2^n \cdot y (m, n lẻ). Nhận thấy gcd(2^m, y) = gcd(2^n, x) = 1 nên muốn b|a thì 2^n | 2^my|x, suy ra m \ge n.

Với b \le 18 ta có bài toán Regular Expression for Binary Numbers Divisible by n - codewars.

Một số case đặc biệt:

  • Nếu b = 2^k - 1 \Rightarrow 2^{ik} \equiv 1\ \forall i

  • Nếu b = 2^k + 1 \Rightarrow 2^{2ik} \equiv 1,\ 2^{(2i+1)k} \equiv -1\ \forall i

6 Likes

dạ ko vấn đề gì ạ … lúc đầu e hiểu sai là ko so sánh tức là ko đc dùng cả phép bằng luon :sweat_smile:

1 Like

dạ em chưa hiểu ý anh lắm :sweat_smile:

Mình đã nói ý gì đâu, mới bôi ra vài chữ thôi mà.

3 Likes

nếu dùng đến bit thì anh có ý tưởng gì không cho em tham khảo với ạ

1 Like

Không so sánh à ?

if(a % b){
    // không chia hết
}
else{
    // chia hết
}
5 Likes

dạ em cảm ơn . em nhầm ạ :sweat_smile:

1 Like

Đề yêu cầu không so sánh chứ đâu bảo dùng phép toán bit? Như cách @Duong_Act là chuẩn luôn rồi.

6 Likes

Chấm online thì có danh sách các kí hiệu bị cấm chứ.

4 Likes

Chủ thớt thử post đề lên xem đề có cấm những ký tự gì nào.

3 Likes

Dạ em làm bài trong nhóm để luyện tập thôi nên cũng không có nói rõ cấm như nào ạ

while(a > b) a -= b
print(!a)
print(!(a%b))
3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?