30/09/2018, 16:19

Hỏi bài tập (x/1!) +...+(x^n)/n!

Đây là bài em dang làm, khi run nó luôn luôn xuất ra F = 0. Em đã thử debug thì thấy nó bỏ qua vòng lập while của em luôn. Mọi người giúp em sửa với.

//F = x/1! + (x^2)/2! + ... + (x^n)/n!

//n! = n(n-1)(n-2)...4.3.2.1;
float Factorial( float n)
{
    float s = 1;
    if(n == 0)
        return 1;
    for(int f = 1; f <= n; f++){
        s *= f;
    }
    return s;
}

int main()
{
    // Declaration
    float i = 1, j = 1, x, n, a = 0, b = 0, g = 0, F = 0;
    // Input
    printf("Input x and n");
    // Input x
    printf("
x = ");
    scanf("%d", &x);
    // Input n
    printf("n = ");
    scanf("%d", &n);
    while(i <= n){
        a = pow(x, i);
        b = Factorial(i);
        g = a/b;
        F += g;
        i++;
        j++;
    }
    //F = x/1! + (x^2)/2! + ... + (x^n)/n!
   // Output
   printf("F = %f", F);
    return 0;
}
Trần Hồng Phong viết 18:26 ngày 30/09/2018

Do em khai báo float x, n; nhưng lại truyền %d khi nhập.
Ngoài ra có vài lời khuyên cho bài này

  1. Em phân biệt nên dùng int thì dùng int đừng nên lạm dụng cho tất cả kiểu float như vậy
  2. Cách đặt tên biến nên dễ hiểu, bài này nhỏ, bài lớn hơn sau này em có coi lại không biết mình đã viết gì đâu
  3. Không nên dùng hàm giai thừa và hàm pow trong trường hợp này. Vì mỗi lần lặp nó sẽ gọi lại hàm, mà không sử dụng lại giá trị trước đó. Em tìm cách tôi ưu bài này lại nhé
BaoLe viết 18:27 ngày 30/09/2018

Mới nghĩ ra,bạn kiểm tra thử xem có lỗi gì không?

#include<stdio.h>
#include<math.h>
//Hàm tính giai thừa
float giai_thua( int n)
{
    int giaithua = 1;
    for(int i=1;i<=n;i++){
        giaithua*=i;
    }
    return giaithua;
}

int main()
{
    float Sum = 0;
    int x=0,n=0;
    printf("Nhap x va n:");
    printf("\nx = ");
    scanf("%d",&x);
    printf("\nn= ");
    fflush(stdin);//xóa bộ nhớ đệm để tránh trôi lệnh.
    scanf("%d", &n);
//Tính tổng theo yêu cầu đề bài
    for(int i=1;i<=n;i++){
        Sum+=(1.0*pow(1.0*x,1.0*i)/giai_thua(i));
    }
    printf("Tong can tim bang: %f",Sum);
    return 0;
}
Trần Hồng Phong viết 18:35 ngày 30/09/2018

Hì, nó cũng gần giống thuật toán cũ Vẫn sử dụng hàm giai_thua() và hàm pow(). Không sử dụng lại được kết quả trước đó. Mỗi lần lặp lại chạy 2 vòng lặp mới - 1 của giai_thua() và 1 của pow() rất tốn kinh phí. Tham khảo code bên dưới xem có gì không hiểu không nhé.

float _sum(int x, int n){
	int giai_thua = 1, t = 1;
	float sum = 0;

	for(int i = 1; i <= n; i++){
		giai_thua *= i
		t *= x;
		sum += float(t)/float(giai_thua);
	}
	
	return sum;
}
nhatlonggunz viết 18:27 ngày 30/09/2018

float(t) với float(giai_thua) là sao anh

Trần Hồng Phong viết 18:20 ngày 30/09/2018

Ép kiểu 2 thằng đó là kiểu int nhưng trong phép chia đó anh muốn nó là kiểu float nên viết vậy

Quân viết 18:27 ngày 30/09/2018

ép kiểu là (kiểu cần ép) biến
VD: (float) a

Bài liên quan
0