01/10/2018, 17:07
Code nhập số tự nhiên n, tính tổng 1+1/2+1/3+1/4+...+1/n chỉ ra 1
Mình code như thế này, khi chạy thì nhập vào n bằng mấy thì kết quả trả cũng bằng 1 cả là sao ? Các bạn giúp mình với !!!
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, p;
float Sum=0;
printf("Nhap n: ");
scanf("%d", &p);
for(n=1; n<=p; n++){
Sum += 1/n;
}
printf("TONG = %f", Sum);
return 0;
}
Bài liên quan
Vấn đề ở đây. Bạn cần nhập n nhưng lại truyền &p vào hàm scanf.
Sửa thành
Sum += 1/(float)n
xemBạn có thể xem lý do ở đây:
giá trị của p chưa được khởi tạo, và khi nhập n bạn lại scanf &p.
Hoặc cũng có thể sửa thành
Sum += 1.0 / n
.Bạn sửa thành 1.0/n nhé
Đây không phải là vấn đề,đoạn đó bạn ấy làm đúng rồi.
Lỗi là ở chỗ này:
1/n
với n là kiểu int thì cho kết quả -1 với n=-1, kết quả 1 với n=1 và bằng 0 với tất cả n khác 1 -1 0Mình đồng ý. Nhưng đọc topic thì thấy phần mô tả trong code và trong tiêu đề của bạn ấy thế này không đúng:
Sao lại cần 1.0 hả bạn ?
vì nếu 2 toán hạng là số nguyên, kết quả sẽ bị ép thành số nguyên.
1/1 = 1
1/2 = 0
1/0.5 = 2.0
1.0/2 = 0.5
Mình hiểu rồi
Vì phép / là phép chia lấy nguyên, nên sẽ chỉ cho ra giá trị nguyên. Còn nếu ta muốn cho ra giá trị chính xác của nó, ta có 3 cách sau:
+) đổi Sum += 1/n thành Sum+=1/(float)n
+) đổi Sum += 1/n thành Sum+=1.0/n
+) đổi tất cả các ẩn về dạng float
Cảm ơn các bác nhé!
Câu 1 và câu 2 không giống nhau vì 1.0 là double,
1.0f
mới là float.Khi hai toán hạng 1 nguyên 1 thực thì tự động ép kiểu (cast) toán hạng nguyên thành thực ngay. Nên câu sau cũng không cần thiết.
Phần ép kiểu (casting) này đặc biệt thốn với toán hạng là số nguyên có dấu, lẫn với số nguyên không dấu.
Bạn thử đổi thành như sau xem:
Sum = Sum + (float)1/n;
và
printf("TONG = %.5f", Sum);
chỉ cần n và sum thôi bạn
đang reply cho ông kia mà…
:3 chủ post chỉ đặt n tượng trưng thôi :3 nên ko ảnh hưởng đâu
Ok thanks mọi người nhé. Cái này đúng là hơi phức tạp thật, nên mình sẽ hiểu dần :))