Halo Saya menulis sebuah loop untuk mendapatkan jumlah faktorial dari nilai yang diberikan n dibagi dengan n dengan meningkatnya eksponen. Untuk menggambarkannya lebih baik terlihat seperti ini:

enter image description here

Tetapi untuk beberapa alasan loop saya selalu mengembalikan nilai 1 setiap kali saya memasukkan angka. Inilah lingkaran saya:

int nVal, i, j, k, nProduct = 1, nSum = 0, nFactorial = 1;
float fResult;

for (i = 1; i <= nVal; i++)
{
    for (j = 1; j <= nVal; j++)
    {
        nFactorial *= j;
        nSum += nFactorial;
    }
    for (k = 1; k <= nVal; k++)
    {   
        nProduct *= k;
    }
    fResult += (nSum * 1.0) / (nProduct * 1.0);
}

Adakah perbaikan yang bisa saya coba?

1
Marty Mcfly 16 Januari 2021, 08:40

3 jawaban

Jawaban Terbaik

Seberapa besar yang akan diperoleh n? Ini dapat menentukan jenis nProduct dan nFactorial seharusnya (mis. int atau long long atau __int128 atau double).

Loop bersarang/dalam salah. Anda hanya menginginkan/membutuhkan loop for untuk i.

Dan Anda akan [mungkin/mungkin] meluap/mengalir jika Anda menunggu untuk menghitung rasionya. Jadi, lakukan ini pada setiap iterasi.

Garis perhitungan faktorial Anda baik-baik saja. Namun, perhitungan nProduct salah. Pengganda harus n [dan bukan j].

Anda tidak menginisialisasi fResult, jadi ini dimulai dengan nilai acak (yaitu perilaku tidak terdefinisi). Ini akan ditandai jika Anda mengkompilasi dengan -Wall [dan -O2] untuk mengaktifkan peringatan.

Ingat bahwa:

k! = (k - 1)! * k

Dan itu:

n**k = n**(k - 1) * n

Jadi, kita dapat membangun subterm nFactorial dan nProduct subterm secara iteratif, dalam satu loop.

Inilah yang menurut saya kode Anda seharusnya:

// pick _one_ of these:
#if 0
typedef int acc_t;
#endif
#if 0
typedef long long acc_t;
#endif
#if 0
typedef __int128 acc_t;
#endif
#if 1
typedef double acc_t;
#endif

double
calc1(int nVal)
{
    int i;
    acc_t nProduct = 1;
    acc_t nFactorial = 1;
    double ratio;
    double fResult = 0;

    for (i = 1;  i <= nVal;  ++i) {
        nFactorial *= i;
        nProduct *= nVal;

        ratio = (double) nFactorial / (double) nProduct;
        fResult += ratio;
    }

    return fResult;
}
0
Craig Estey 16 Januari 2021, 06:52

Kode OP salah dalam perhitungan pembilang dan penyebut. Juga, matematika bilangan bulat mudah meluap.

Untuk menangani n besar dengan lebih baik, bentuk setiap suku berdasarkan suku sebelumnya dengan matematika floating point.

double sum_fact_expo(int n) {
  double sum = 0.0;
  double ratio = 1.0;
  for (int i = 1; i <= n; i++) {
    ratio *= 1.0*i/n;
    sum += ratio;
  }
  return sum;
} 
2
chux - Reinstate Monica 16 Januari 2021, 06:59
#include <stdio.h>

int main(void) {
  int nVal, i, j, k, nProduct = 1, nFactorial = 1;
  float fResult = 0;

  scanf("%d", &nVal);

  for (i = 1; i <= nVal; i++)
  {
    for (j = 1; j <= i; j++)
    {   
      //calculate 1! 2! 3! ... n!
      //actually calculate i!
      nFactorial *= j;
    }   
    for (k = 1; k <= i; k++)
    {   
      //calculate n^1 n^2 n^3 ... n^n
      //actually calculate n^i
      nProduct *= nVal;
    }   
    fResult += (nFactorial * 1.0) / (nProduct * 1.0);
    nProduct = 1;
    nFactorial = 1;
  }

  printf("%f\n", fResult);
  return 0;
}
0
tyroc 16 Januari 2021, 06:55