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
numlàm đầu vào. - Hàm
sum_consecutive(int num)nhậnnumvà trả về số cách biểu diễnnumdướ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
reskiểu float. - Sử dụng vòng lặp for duyệt từ
i=1đếni*(i+1)/2 < num. - Tính giá trị
[num - (i)*(i+1)/2] / (i+1)và lưu trongres. - Nếu
reslà số nguyên (res - (int)reslà 0) thì tăng biến đếm. - Cuối cùng, chúng ta có biến đếm là số cách
numcó 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