【问题标题】:Prime Factors In C#C# 中的质因数
【发布时间】:2011-08-17 21:28:34
【问题描述】:

我想在 C# 2005 中创建一个计算给定输入的素数的程序。我想使用基本和最简单的东西,不需要为它创建一个方法,也不需要数组等等。只是简单的模数。有什么代码可以满足我的愿望吗?

这是查找简单因子的代码,我需要修改此代码以计算素因子

class Program
{
    static void Main(string[] args)
    {
        int a, b;
        Console.WriteLine("Please enter your integer: ");
        a = int.Parse(Console.ReadLine());
        for (b = 1; b <= a; b++)
        {
            if (a % b == 0)
            {
                Console.WriteLine(b + " is a factor of " + a);
            }
        }
        Console.ReadLine();



    }
}

【问题讨论】:

  • 自己写应该足够简单。你坚持哪一点 - 你需要什么帮助?
  • 我尝试了很多代码,但都没有工作,假设如果 10 个素数是 2 和 5,那么它在我的程序中显示为 25...现在这是什么。
  • 你能贴一些你试过的代码吗?到目前为止你有什么?
  • 关于这个问题的算法有一个很好的概述here
  • 对了,这是作业吗?

标签: c# primes prime-factoring


【解决方案1】:
int a, b;
Console.WriteLine("Please enter your integer: ");
a = int.Parse(Console.ReadLine());

for (b = 2; a > 1; b++)
    if (a % b == 0)
    {
        int x = 0;
        while (a % b == 0)
        {
            a /= b;
            x++;
        }
        Console.WriteLine($"{b} is a prime factor {x} times!");
    }
Console.WriteLine("Th-Th-Th-Th-Th-... That's all, folks!");

【讨论】:

  • 您需要告诉我们错误是什么。 (顺便说一句,这将消除重复的因素,而不是将其过滤到素数 - 你可能想显示一个素数何时重复?)实际上你的代码显示 1 作为一个因素 - 是它卡在无限循环中的错误尝试排除1? 1 永远不会是主要因素,因此从 2 开始循环可能更容易,但您也需要进行主要过滤。
  • 超级赞我机器徽章上的作品,我在偷这个。
  • @Chris Marisic - 这是一个永远不会变老的old thing。 :)
  • @ChrisMarisic 支持他的帖子和您的评论。真是天才!
【解决方案2】:
public static List<int> Generate(int number)
{
    var primes = new List<int>();

    for (int div = 2; div <= number; div++)
        while (number % div == 0)
        {
            primes.Add(div);
            number = number / div;
        }
    
    return primes;
}

如果你想了解开发步骤可以watch video here

【讨论】:

  • 除数永远不能大于 number / 2,所以你可以这样优化:for(int div = 2; div
【解决方案3】:

因为除数永远不会大于数字的平方根,所以你可以做得更好。

 for(int div = 2; div <= Math.Sqrt(number); div++)

【讨论】:

  • 但在for 结束后,您必须将number 添加到primes ... if (number &gt; 1) primes.Add(number);
【解决方案4】:

此版本将所有因素作为明确的公式列出:

static void Main(string[] args)
    {
        Console.WriteLine("Please enter your integer (0 to stop): ");

        int a = int.Parse(Console.ReadLine());
        while(a>0)
        {
            List<int> primeFactors = PrimeFactors(a);
            LogFactorList(primeFactors);
            a = int.Parse(Console.ReadLine());
        }
        Console.WriteLine("Goodbye.");
    }


    /// <summary>
    /// Find prime factors
    /// </summary>
    public static List<int> PrimeFactors(int a)
    {
        List<int> retval = new List<int>();
        for (int b = 2; a > 1; b++)
        {               
            while (a % b == 0)
            {
                a /= b;
                retval.Add(b);
            }               
        }
        return retval;
    }

    /// <summary>
    /// Output factor list to console
    /// </summary>
    private static void LogFactorList(List<int> factors)
    {
        if (factors.Count == 1)
        {
            Console.WriteLine("{0} is Prime", factors[0]);
        }
        else
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < factors.Count; ++i)
            {
                if (i > 0)
                {
                    sb.Append('*');
                }
                sb.AppendFormat("{0}", factors[i]);
            }
            Console.WriteLine(sb.ToString());
        }
    }

【讨论】:

    【解决方案5】:

    试试这段代码(我在这段代码中加入了各种解决方案)。虽然,插值不是在 2005 年(我想是这样......)

    所以,无论如何,试试这个:

    // C# Program to print all prime factors 
    using System; 
    
    namespace prime
    {
        public class Prime
        { 
    
            public static void PrimeFactors(int n)
            {
                Console.Write($"Prime Factors of {n} are:  ");
    
                // Prints all the numbers of 2  
                while (n % 2 == 0)
                {
                    Console.Write("2 ");
                    n /= 2;
                }
    
                // As no 2 can be further divided, this probably means that n
                // is now an odd number
                for(int i = 3; i <= Math.Sqrt(n); i += 2)
                {
                    while (n % i == 0)
                    {
                        Console.Write($"{i} ");
                        n /= i;
                    }
                }
    
                // This is for case if n is greater than 2
                if (n > 2)
                {
                    Console.Write($"{n} ");
                }
    
            }
    
            // Prompts user to give Input to number and passes it on 
            // the PrimeFactors function after checking its format
            public static void RunPrimeFactors()
            {
                Console.Write("Enter a number: ");
                if (int.TryParse(Console.ReadLine(), out int n))
                {
                    PrimeFactors(n);
                }
                else
                {
                    Console.WriteLine("You entered the wrong format");
                }
    
            }
            // Driver Code 
            public static void Main()
            {
                RunPrimeFactors();
            }
    
        }
    }
    

    【讨论】:

      【解决方案6】:
      using static System.Console;
      
      namespace CodeX
      {
          public class Program
          {
              public static void Main(string[] args)
              {
                  for (int i = 0; i < 20; i++)
                  {
                      if (IsPrime(i))
                      {
                          Write($"{i} ");
                      }
                  }
              }
      
              private static bool IsPrime(int number)
              {
                  if (number <= 1) return false;  // prime numbers are greater than 1
      
                  for (int i = 2; i < number; i++)
                  {
                      // only if is not a product of two natural numbers
                      if (number % i == 0)       
                          return false;
                  }
      
                  return true;
              }
          }
      }
      

      【讨论】:

      • 除了提供解决问题所需的代码之外,请考虑解释您的答案。
      • 在素数上找到这个定义@维基百科。素数从 2 开始,然后 IsPrime(number) 方法循环遍历从 2 开始但小于给定数字的所有数字,以检查一个可以除以给定数字而没有余数的数字。..
      • 此代码不回答问题。它打印从 0 到 19 的所有素数,而不是数字的素数。效率也很低。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 2019-04-26
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      相关资源
      最近更新 更多