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;
}
NBQ viết 19:17 ngày 01/10/2018

printf(“Nhap n: “);
scanf(”%d”, &p);
for(n=1; n<=p; n++){

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

Pham Van Hai viết 19:16 ngày 01/10/2018

Sum += 1/n;

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

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

Đây là code: int a = 3, b = 4; double c = a / b; Console.WriteLine( c ); --> kết quả =0. int a = 3, b = 4; double c = ( double ) a / (double) b ; Console.WriteLine( c); -->Kết quả =0.75. Tại sao lại phải ép kiểu về double nhỉ,có cách nào chia ra 0.75 mà không cần ép kiểu k ạ

Traullu viết 19:12 ngày 01/10/2018

scanf("%d", &p);

giá trị của p chưa được khởi tạo, và khi nhập n bạn lại scanf &p.

Lam Pham viết 19:20 ngày 01/10/2018

Hoặc cũng có thể sửa thành Sum += 1.0 / n.

Nguyễn Văn Khương viết 19:11 ngày 01/10/2018

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

Quân viết 19:13 ngày 01/10/2018

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

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

NBQ viết 19:15 ngày 01/10/2018

Mì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:

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);
Nguyễn Ngọc Huy viết 19:11 ngày 01/10/2018

Sao lại cần 1.0 hả bạn ?

Trần Hoàn viết 19:24 ngày 01/10/2018

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

Nguyễn Ngọc Huy viết 19:10 ngày 01/10/2018

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

rogp10 viết 19:14 ngày 01/10/2018

+) đổ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â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.

Quan viết 19:23 ngày 01/10/2018

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

Sum = Sum + (float)1/n;

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

!IsProgrammer viết 19:16 ngày 01/10/2018

đổi tất cả các ẩn về dạng float

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

rogp10 viết 19:12 ngày 01/10/2018

đang reply cho ông kia mà…

Kopebanmuoi viết 19:22 ngày 01/10/2018

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

Nguyễn Ngọc Huy viết 19:20 ngày 01/10/2018

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

Bài liên quan
0