Tính tổng các số nguyên nhỏ hơn n chia hết cho a nhưng k chia hết cho b

tính tổng các số nguyên nhỏ hơn n chia hết cho a nhưng k chia hết cho b

#include<stdio.h>
int chiahet(int m, int a, int b);
int main()
{
    int a, b, n, s=0;
    printf("nhap 3 so nguyen a b n voi a,b<n\n");
    scanf("%d%d%d", &a, &b, &n);
    if(a<n && b<n)
    {

       for (int i=1; i<n; i++)
        {
            if(chiahet(n, a, b) == 1)
            s+=i;
         }
    }
    printf("tong cac so nguyen < n chia het cho a nhung khong chia het cho b la %d", s);
}
int chiahet(int m,int a, int b)
{

    if (m%a==0 && m%b!=0)
        return 1;
    return 0;
}

mọi người cho hỏi code e sai chỗ nào mà chạy nó toàn ra kết quả =0 .

bạn xem kỹ lại điều kiện nhé :smile:

z là if (chiahet(n,a,b)==1)
nhưng vẫn k dc bạn ơi
k pit lỗi chỗ nào nữa

Bạn ơi, điều kiện là a, b < n, vậy cái này là gì đây ?

if(a < n && n < b)

sửa rồi vẫn chưa dc @nhatlonggunz ơi

Vậy hàm chia hết, bạn thử làm thế này xem

int chiahet(int m, int a, int b)
{
    if((m % a == 0) && (m % b != 0))
        return 1;
    return 0;
}

cug k dc để mình show code lên cho bạn chạy thử

#include<stdio.h>
int chiahet(int m, int a, int b);
int main()
{
    int a, b, n, s=0;
    printf("nhap 3 so nguyen a b n voi a,b<n\n");
    scanf("%d%d%d", &a, &b, &n);
    if(a<n && b<n)
    {

       for (int i=1; i<n; i++)
        {
            if(chiahet(n, a, b) == 1)
            s+=i;
         }
    }
    printf("tong cac so nguyen < n chia het cho a nhung khong chia het cho b la %d", s);
}
int chiahet(int m,int a, int b)
{

    if (m%a==0 && m%b!=0)
        return 1;
    return 0;
}

Vậy thì có lẽ là do scanf :v

Mình vừa sửa lại scanf của bạn và okay

scanf("%d %d %d");

Bạn test vớ a,b như thể nào?

Em chỉnh lại cái scanf thì lại được anh @Gio ơi ?

1 Like

Bài này có thể chạy trong O(1) đấy :smile:

:slight_smile: :slight_smile:
Em nghĩ là nên lấy bội của a, để kiểm tra, như thế sẽ bớt được rất nhiều :slight_smile:
Không biết còn cách nào nhanh hơn không ?

@Gio

ok mình sửa được rồi bạn

g=a* b/__gcd(a,b);

Tổng số từ 1->n chia hết cho x:
F(n,x)= { k=(n-1)/x; return xk(k+1)/2;}
=>
s=F(n,a) - F(n,g);
update
k=(n-1)/x vì đếm < n

  • quên là bcnn nên viết thiếu tích a*b :smiley:

@huyenthoai bạn thử cho mình xem input của bạn để đi, mình làm code y chang vậy vẫn ra mà

Lol. Kết quả nhìn hư cấu hoá ra thay biến i = n à? :joy:

Éc, để em debug lại :v

không phải @Gio vẫn giữ là i
ý tưởng như đã nói ở trên

Ý anh ấy nói là mình nhầm i thành n
Nhưng cũng vậy mà anh @Gio :’(

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