Hỏi code đếm các số chia hết cho 9

Em muốn chương trình đếm số các số chia hết cho 9 em cho nó vào array và sử dụng sizeof() để đếm các số chia hết cho 9 nhưng nó chỉ in ra số 1 giúp em với ạ

int a,b,i;
int numbers[]={i};
cin >>a>>b;
for (i=a; i<=b; i++)
if (i%9==0){
cout << sizeof(numbers)/sizeof(numbers[0]);
}

Bạn muốn: Đếm xem có bao nhiêu số trong khoảng [a:b] chia hết cho 9?
Thứ nhất:

int a,b,i;
int numbers[]={i}; // i = ?

Thứ hai:

cout << sizeof(numbers)/sizeof(numbers[0]); // In ra kích thước của mảng numbers
                                            // numbers chỉ đang chứa i thôi, in ra 1 là đúng rồi còn gì?

Thứ ba:
Cách bạn đếm là thế nào?
Tui chỉ thấy bạn in ra kích thước của mảng numbers thôi, không có chỗ nào gọi là đếm cả?

2 Likes

cảm ơn bạn mình đã cố sử dụng array vì mình nghĩ sizeof() có thể đếm số trong array nhưng đây là số mình nhập vào nên không biết giới hạn mà array phải biết giới hạn thì mới dùng được trong C++ nhưng sau khi tham khảo ở một số forum khác thì mình đã tìm ra cách giải cảm ơn bạn đã chỉ ra lỗi sai cho mình

#include <iostream>
#include <vector>
#include <utility>

int main()
{
    int a = 0, b = 0;
    std::vector<int> numbers;

    const int divisor = 9; 

    std::cout << "Enter two integer numbers: ";
    std::cin >> a >> b;

    if ( b < a ) std::swap( a, b );

    for ( int i = a; not ( b < i ); ++i )
    {
        if ( i % divisor == 0 ) numbers.push_back( i );
    }

    std::cout << "There are " << numbers.size() 
              << " numbers divisible by " << divisor
              << " in the range [" << a << ", " << b << "]\n";
}

mình đã sử dụng std::vector để đếm các số chia hết cho 9 mình đã nhập vào

Bài này đâu cần đến mảng và cũng không cần lặp qua từng số trong đoạn [a,b].
Rõ là một số chia hết cho 9 thì cộng thêm các bội số của 9 đều chia hết cho 9.
Mã giả:

input(a, b)
for(i = (int(a/9) + ((a%9) != 0)) * 9; i <= b; i+=9){
    print(i)
}
3 Likes

(Edited the formula as suggestion of @rogp10)

Nếu yêu cầu chỉ là đếm số lượng các phần tử chia hết cho 9 trong khoảng từ A đến B, thì mình có thể áp dụng công thức luôn chứ không cần lặp để đếm, và công thức có thể áp dụng cho một số N nguyên dương bất kỳ chứ không hẳn phải là 9.

R = (B / N - A / N) + (A % N == 0);

Ví dụ:
N = 1, range [5, 10]
=> R = 10 / 1 - 5 / 1 + 1 = 6
N = 2, range [5, 10]
=> R = 10 / 2 - 5 / 2 + 0 = 3

int CountNumbersDivideByN(int A, int B, int N)
{
	return (B / N - A / N) + (A % N == 0);
}

(Vì phép chia số nguyên kiểu int trong máy tính khác với phép chia trong toán học nên không thể rút gọn biểu thức thành (B - A) / N được nha)

4 Likes

Không đúng, A = 5 B = 27 N = 9.
Sửa lại thành return (B / N - A / N) + (A % N? 0 : 1) nhé.
Tức là nếu A chia hết cho N thì tính vào luôn :slight_smile:


Mình thì làm ntn:

Nếu A không chia hết cho 9 thì ta lấy số lớn hơn gần nhất chia hết cho 9 là A’.
Nếu B không chia hết cho 9 thì ta lấy số bé hơn gần nhất chia hết cho 9 là B’.
Như vậy công thức là \frac{B' - A'}{N} + 1

edit: Không cần lấy B’ (do A’ chia hết cho N nên số dư của B không ảnh hưởng), chỉ cần thay bằng phép chia nguyên:

\begin{aligned} &\ \left \lfloor \frac{B - A'}{N} \right \rfloor + 1\\ \cr[-0.7em] &= \left \lfloor \frac{B' + r_B - A'}{N} \right \rfloor + 1,\ 0 \leq r_B < N\\ \cr[-0.7em] &= \left \lfloor \frac{B' - A'}{N} + \frac{r_B}{N}\right \rfloor + 1, \ 0 \leq r_B < N\\ \cr[-0.7em] &= \frac{B' - A'}N + 1 \end{aligned}
6 Likes

Ý tưởng tìm số chia hết cho N gần với A, B nhất để ráp vào công thức của @rogp10 cũng khá hay:

int CountNumbersDivideByN(int A, int B, int N)
{
	A += (N - A % N);
	B -= (B % N);
	//cout << A << " " << B << endl;
	return (B - A) / N + 1;
}
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?