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

Đếm số cách biểu diễn số dưới dạng tổng các số liên tiếp trong C++


Cho một số nguyên n làm đầu vào. Mục tiêu là tìm số cách mà chúng ta có thể biểu diễn num dưới dạng tổng của hai hoặc nhiều số tự nhiên liên tiếp. Ví dụ, nếu n là 3, nó có thể biểu diễn dưới dạng tổng (1+2) nên tổng 1 cách.

Ví dụ

Đầu vào

num=6

Đầu ra

Số cách biểu diễn số dưới dạng tổng các số liên tiếp là: 1

Giải thích

Cách biểu diễn 'num' dưới dạng tổng các số tự nhiên liên tiếp: 1+2+3

Đầu vào

num=19

Đầu ra

Số cách biểu diễn số dưới dạng tổng các số liên tiếp là: 1

Giải thích

Cách biểu diễn 'num' dưới dạng tổng các số tự nhiên liên tiếp: 9+10

Phương pháp sử dụng

Trong phương pháp này, chúng ta sẽ biểu diễn số dưới dạng tổng của (a + a+1 + a+2...+ a+i).

Thành (a)*(L+1) lần + 1+2+3+4...+i = a*(i+1) + i*(i+1)/2 (tổng i số tự nhiên) num = a*(i+1) + i*(i+1)/2. a = [num - (i)*(i+1)/2] / (i+1).

Chúng ta sẽ làm điều này cho i=1 đến i*(i+1)/2 < num.

  • Nhận số nguyên num làm đầu vào.
  • Hàm sum_consecutive(int num) nhận num và trả về số cách biểu diễn num dưới dạng tổng các số tự nhiên liên tiếp.
  • Khởi tạo biến đếm ban đầu là 0.
  • Lấy biến tạm res kiểu float.
  • Sử dụng vòng lặp for duyệt từ i=1 đến i*(i+1)/2 < num.
  • Tính giá trị [num - (i)*(i+1)/2] / (i+1) và lưu trong res.
  • Nếu res là số nguyên (res - (int)res là 0) thì tăng biến đếm.
  • Cuối cùng, chúng ta có biến đếm là số cách num có thể biểu diễn dưới dạng tổng các số tự nhiên liên tiếp.
  • Trả về biến đếm làm kết quả.

Ví dụ mã

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

int sum_consecutive(int num) {
    int count = 0;
    int temp = num * 2;
    float res;
    
    for (int i = 1; i * (i + 1) < temp; i++) {
        int store = i + 1;
        res = (1.0 * num - (i * (i + 1)) / 2) / store;
        float check = res - (int)res;
        
        if (check == 0.0) {
            count++;
        }
    }
    
    return count;
}

int main() {
    int num = 20;
    cout << "Số cách biểu diễn số dưới dạng tổng các số liên tiếp là: " << sum_consecutive(num) << endl;
    return 0;
}

Đầu ra

Nếu chạy mã trên, sẽ tạo ra đầu ra sau:

Số cách biểu diễn số dưới dạng tổng các số liên tiếp là: 1