Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Đếm số trong khoảng chỉ có chữ số khác 0, tổng chữ số bằng N và chia hết cho M trong C++


Cho hai số START và END xác định một khoảng số. Mục tiêu là tìm tất cả các số trong khoảng [START, END] không có chữ số nào là 0, có tổng chữ số bằng số N cho trước, và số đó chia hết cho M.

Ta thực hiện bằng cách duyệt số từ START đến END và với mỗi số đếm tổng chữ số bằng vòng lặp while (chỉ khi tất cả chữ số khác 0). Nếu tổng này bằng N và số chia hết cho M, tăng count.

Hãy hiểu qua các ví dụ.

Đầu vào

START=1 END=100 N=9 M=6

Đầu ra

Số có tổng chữ số N và chia hết cho M: 4

Giải thích

Các số 18, 36, 54, 72 có tổng chữ số=9 và chia hết cho 6. Không số nào có chữ số 0.

Đầu vào

START=100 END=200 N=10 M=2

Đầu ra

Số có tổng chữ số N và chia hết cho M: 4

Giải thích

Các số 118, 136, 154, 172 có tổng chữ số=10 và chia hết cho 2. Không số nào có chữ số 0.

Phương pháp sử dụng trong chương trình dưới đây

  • Nhận số nguyên START, END, N và M.
  • Hàm digitSum(int start, int end, int n, int m) trả về số lượng số có tổng chữ số=n, chia hết cho m và tất cả chữ số khác 0.
  • Khởi tạo biến count = 0 cho các số như vậy.
  • Biến digsum = 0.
  • Biến flag = 0.
  • Duyệt khoảng số bằng vòng lặp for. i=start đến i=end.
  • Với mỗi số num=i, nếu num%m==0 (chia hết cho m) thì tiếp tục.
  • Dùng vòng lặp while kiểm tra số > 0. Và tìm chữ số.
  • digit = num%10. Nếu digit khác 0 tính digsum += digit. Giảm num = num/10 để lấy chữ số tiếp theo. Nếu có chữ số 0 gán flag=0 và thoát while.
  • Sau while, kiểm tra nếu (digsum == n và flag == 1). Nếu đúng tăng count.
  • Tăng i thêm m (theo bội của m).
  • i-- (vì vòng for có i++).
  • Sau tất cả vòng lặp count chứa tổng số thỏa mãn điều kiện.
  • Trả về count làm kết quả.

Ví dụ

#include <bits/stdc++.h>
using namespace std;

int digitSum(int start, int end, int n, int m) {
    int count = 0;
    int digsum = 0;
    int flag = 0;
    for (int i = start; i <= end; i++) {
        int num = i;
        digsum = 0;
        flag = 0;
        if(num % m == 0) {
            while(num > 0) {
                int digit = num % 10;
                if(digit == 0) {
                    flag = 0;
                    break;
                }
                digsum += num % 10; // tổng chữ số
                num = num / 10;
                flag = 1;
            }
            if(digsum == n && flag == 1) { // số gốc là i
                count++;
                cout << i << " ";
            }
            i += m; // tăng theo bội của m
            i--; // vì for có i++
        }
    }
    return count;
}

int main() {
    int START = 1;
    int END = 100;
    int N = 9;
    int M = 6;
    cout << "Số có tổng chữ số N và chia hết cho M: " << digitSum(START, END, N, M);
    return 0;
}

Đầu ra

Nếu chạy mã trên sẽ cho kết quả sau:

Số có tổng chữ số N và chia hết cho M: 4