Viết chương trình tìm số n nhỏ nhất sao cho
1+1/2+...+1/n>S
với S là số thực (double) dương được đọc từ bàn phím.
Đầu vào
Một số thực dương S (0<S≤10.0).
Đầu ra
In n ra màn hình.
Chú ý
Dữ liệu đầu vào luôn hợp lệ, bạn không cần kiểm tra.
Không sử dụng printf trước scanf.
Xem thêm các ví dụ trong phần For example để biết thêm chi tiết về đầu vào/đầu ra.
Gợi ý
Bài này thuộc dạng tìm số đầu tiên thoả điều kiện kết hợp với tính giá trị cho bước kế tiếp dựa vào bước hiện tại.
tong = 1.0
Cho n chạy từ 0, 1, 2, ...
Kiểm tra điều kiện tong > S, nếu thoả thì thoát
Tính lại tong cho bước kế tiếp (n+1) = tong (cũ) + 1/(n+1)
In giá trị của n
example
input 1.0
output 2
em chưa hiểu chỗ gợi ý tại sao tong = 1 rồi xuống dưới lại kêu tính tổng lại cái nữa
với lại nếu tổng đã = 1 thì chạy n làm chi ạ
giải thích giúp em với ạ !!
Tại vì người nào đó đưa ra cái gợi ý lủng củng.
Trong chuỗi số 1 + 1/2 + 1/3 + ... + 1/n
thì phần tử đầu tiên, 1, ứng với n = 1.
Lúc n = 0 thì đáng lẽ tổng phải bằng 0.
Code theo "gợi ý" ban đầu thì như vầy:
double tong;
int n;
for (n = 1, tong = 1.; tong <= S; tong += 1./++n);
// khi vòng lặp này thoát thì n là đáp số.
Code theo giải thuật tốt hơn thì như vầy:
int n;
for (n = 0; S >= 0; S -= 1./++n);
Lưu ý: các con số 1 đều có dấu chấm để bảo đảm chúng là số thực. Nếu không có dấu chấm thì chúng là số nguyên. C/C++ sẽ dùng phép chia số ngyên nếu cả tử lẫn mẫu đều là số nguyên.