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;
}

Vấn đề ở đây. Bạn cần nhập n nhưng lại truyền &p vào hàm scanf.

1 Like

Sửa thành Sum += 1/(float)n xem

Bạn có thể xem lý do ở đây:

3 Likes

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.

3 Likes

Bạn sửa thành 1.0/n nhé

1 Like

Đâ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 0

1 Like

Mình đồng ý. :slight_smile: 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

2 Likes

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é!

1 Like

Câu 1 và câu 2 không giống nhau :smiley: 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.

1 Like

Bạn thử đổi thành như sau xem:

Sum = Sum + (float)1/n;

printf("TONG = %.5f", Sum);

chỉ cần n và sum thôi bạn :wink:

đang reply cho ông kia mà…

2 Likes

:3 chủ post chỉ đặt n tượng trưng thôi :3 nên ko ảnh hưởng đâu

1 Like

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 :))

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?