Как я могу написать эту формулу в C #?(Что не так с тем, как я кодирую?) - PullRequest
0 голосов
/ 23 ноября 2018

Надеюсь, у вас все в порядке, я буду рад, если вы поможете мне с этой проблемой ... Thnx

Я написал этот код для формулы: "http://up.upinja.com/zvhev.png"

Console.WriteLine("Enter two Numbers to start the Equation (X=Number , N=Power)" + "");
int X = int.Parse(Console.ReadLine());
int N = int.Parse(Console.ReadLine());
double sum = 0;
double up = 1;
int down = 1;

double sentence;
for (int i = 1; i < N; i++)
{
up = Math.Pow(X, N);
down = N * i;
sentence = up / down;
sum += sentence;
}
Console.WriteLine("The Sum is : " + sum);

Я хочу, чтобы эта математическая формула была написана на C # .... мой код работает, но я получаю неправильный ответ ... Не могли бы вы помочь мне исправить это?

Ответы [ 4 ]

0 голосов
/ 23 ноября 2018

Вы можете немного упростить это.Но сначала, что не так с вашим существующим кодом, так это то, что вы неправильно вычисляете i!.Последовательность, которую вы на самом деле вычисляете сейчас:

X^N / N + X^N / (2 * N) + X^N / (3 * N) + ... + X^N / ((N - 1) * N)

Несколько вещей: - Цикл имеет проблему с одним смещением - Числитель возведен в неверную степень- Знаменатель этих должен быть i!

Факториалы определяются через простое рекуррентное соотношение:

i! = i * (i - 1)! и 0! = 1

Или, другими словами, произведение первых i последовательных натуральных чисел.Поэтому один из способов исправить это - создать метод с именем Factorial:

static long Factorial(int i) 
{ 
    long product = 1;
    while (i > 0) {
        product *= i;
        --i;
    }
    return product;
}

Затем вы можете исправить свой цикл следующим образом:

for (int i = 1; i < N; i++)
{
    sum += Math.Pow(X, i) / Factorial(i);
}

Однако мы переделываем многоработать каждую итерацию цикла, что нам не нужно делать.Вот тут-то и наступает упрощение. Общая формула для i '-го термина такова:

C[i] = X^i / i!

Но мы можем также написать это в терминах термина, который пришелперед этим:

C[i] = C[i-1] * X / i

Таким образом, мы можем переписать цикл следующим образом:

double lastTerm = 1;
for (int i = 1; i <= N; ++i)
{
    // Cast to double here or, probably better, make X a double in the first place.
    lastTerm *= (double) X / i;
    sum += lastTerm;
}

Это имеет несколько преимуществ:

  • Как правило, это будет быстрее, поскольку мы выполняем меньше работы на каждой итерации (Math.Pow вычисляет произвольные степени, поэтому это немного медленнее, чем просто умножение).
  • Это будет менее подвержено численным проблемам.Факториалы становятся действительно большими очень быстро.На самом деле 21!уже слишком велик для хранения в long, поэтому, если ваш N больше этого, все сломается.
0 голосов
/ 23 ноября 2018

п!представляет Факториал.Пожалуйста, обратитесь Факториал , чтобы прочитать о Факториал.

Примерная функция факториала в C # выглядит следующим образом:

long Factorial(long value)
{          
    if (value == 0)
        return 1;

    return value * Factorial(value - 1);
}

Кроме того, следующая строка нуждается в исправлении.

up = Math.Pow(X, N);

Экспонента должна увеличиваться в соответствии с вашимформула.Это должно быть

up = Math.Pow(X, i);
0 голосов
/ 23 ноября 2018

Используйте это:

Console.WriteLine("Enter two Numbers to start the Equation (X=Number , N=Power)" + "");
int X = int.Parse(Console.ReadLine());
int N = int.Parse(Console.ReadLine());
double sum = 0;
double up = 1;
int down = 1;

double sentence;
for (int i = 1; i <= N; i++)
//Change < to <=
{
    up = Math.Pow(X, i);
    //This is a for loop i created to get the factorial of any number, sometimes creating your own functions may be worth it
    for (int a = N, a > 0, a--)
    {
     //Function of this Loop : multiply the value of the denominator by its value - 1 to get the factorial of  the number
        down *= a;
    } 
    sentence = up / down;
    sum += sentence;
}
Console.WriteLine("The Sum is : " + sum);
0 голосов
/ 23 ноября 2018

Что-то не так в Pow, Shoud инкрементное значение

    up = Math.Pow(X, i);
...