2016-06-30 6 views
3

Когда я ввожу число 6 для вычисления его факториала, он возвращает 30 (что неверно).Вычисление факториала числа

Почему моя программа производит неправильный вывод?

using System; 

namespace Scenario1_2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int counter, number, fact; 

      Console.WriteLine("Please enter the number you wish to factorize"); 
      number = int.Parse(Console.ReadLine()); 
      fact = number; 

      for (counter = number - 1; counter >= 1; counter--) 
      { 
       fact = fact * counter; 

       Console.WriteLine("The number you entered was {0} and it's factorial is {1}", number, fact); 
       Console.ReadLine(); 
      } 
     } 
    } 
} 
+3

Перемещайте Console.WriteLine и Readline вне цикла. Это или продолжайте атаковать, пока вы не получите ответ. –

+0

О, я вижу! Большое вам спасибо, это имеет смысл! – WarriorPrincessM

+0

попробуйте [это] (https://dotnetfiddle.net/thhGTa) –

ответ

1

Программа приостановлена, ожидая ввода. Вам нужно переместить второй Console.ReadLine() из цикла. И, вероятно, Console.WriteLine(), если вы не захотите увидеть каждую итерацию.

-1

почему Вы напечатав сообщение внутри loop.put его вне цикла

Console.WriteLine("The number you entered was {0} and it's factorial is {1}", number, fact); 
0

Вы должны переместить две строки из цикла for. Модифицированный код выглядит так.

using System; 

namespace Scenario1_2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int counter, number, fact; 

      Console.WriteLine("Please enter the number you wish to factorize"); 
      number = int.Parse(Console.ReadLine()); 
      fact = number; 

      for (counter = number - 1; counter >= 1; counter--) 
      { 
       fact = fact * counter; 
      } 
      Console.WriteLine("The number you entered was {0} and it's factorial is {1}", number, fact); 
      Console.ReadLine(); 
     } 
    } 
} 

Существует множество способов расчета Факториала. Вы также можете сделать это, создав рекурсивную функцию. Google может помочь вам в этом. Спасибо!

6

Вы смотрите в программирование, или хотя бы C#, так что просто для удовольствия, это будет ударом вашего ума:

using System; 

namespace Scenario1_2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Please enter the number you wish to factorize"); 
      int number = int.Parse(Console.ReadLine()); 
      Console.WriteLine("The number you entered was {0} and it's factorial is {1}", number, Factorial(number)); 
      Console.ReadKey(true); 
     } 

     static int Factorial(int n) 
     { 
      if (n >= 2) return n * Factorial(n - 1); 
      return 1; 
     } 
    } 
} 

Нет петли в любом месте, а функция calls itself.

Вы также можете сделать это следующим образом:

using System; 

namespace Scenario1_2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Please enter the number you wish to factorize"); 
      int number = int.Parse(Console.ReadLine()); 
      Console.WriteLine("The number you entered was {0} and it's factorial is {1}", number, Factorial(number)); 
      Console.ReadKey(true); 
     } 

     static int Factorial(int n) 
     { 
      return Enumerable.Range(1, n).Aggregate((i, r) => r * i); 
     } 
    } 
} 

Что все виды перепутались :) ... но это получить значительную работу вплоть до одной строки кода.

Тогда есть мой личный фаворит, бесконечное перечислимое:

using System; 

namespace Scenario1_2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Please enter the number you wish to factorize"); 
      int number = int.Parse(Console.ReadLine()); 
      Console.WriteLine("The number you entered was {0} and it's factorial is {1}", number, Factorials().Skip(number-1).First()); 
      Console.ReadKey(true); 
     } 

     static IEnumerable<int> Factorials() 
     { 
      int n = 1, f = 1; 
      while (true) yield return f = f * n++; 
     } 
    } 
} 
+0

Ничего себе, спасибо за удивительные примеры! Изучение их дало мне некоторое понимание. Это действительно помогло мне лучше понять рекурсию! Не могу вас поблагодарить! – WarriorPrincessM

-1
using System; 
namespace factorial 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int fact = 1; 
      Console.Write("Enter a number to find factorial:"); 
      int n = int.Parse(Console.ReadLine()); 
      for (int i = n; i > 0; i--) 
      { 
       fact = fact * i; 
      } 
      Console.Write("Factorial of" + n +"is :"+fact); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

Вы должны добавить объяснение с ответами, это поможет другим в будущем. [ответ]. – cosmoonot

-2

using System; 
 

 
namespace septtwenty 
 
{ 
 
    class Program 
 
    { 
 
     static void Main(string[] args) 
 
     { 
 
      int i, number, fact; 
 
      System.Console.WriteLine("Enter the Number"); 
 
      number = int.Parse(Console.ReadLine()); 
 
      fact = number; 
 
      for (i = number -1; i>=1; i--) 
 
      { 
 
       fact = fact * i; 
 
      } 
 
      System.Console.WriteLine("\nFactorial of Given Number is: "+fact); 
 
      Console.ReadLine(); 
 
     } 
 
    } 
 
}

+1

Работает только для чисел под 100 бит. – gododgers

0
int n = 4, fact = n; 
for (int i = n; i > 1; i--) 
{ 
    fact *= (i - 1); 
} 
Console.WriteLine(fact); 
Console.ReadLine(); 
+0

Хотя это может быть ответ на вопрос, потребуется некоторое время, чтобы объяснить, почему это так. Помните, что будущие пользователи SO могут найти это, и любой бит контекста поможет. –