15

I want to create a program in C# 2005 which calculates prime factors of a given input. i want to use the basic and simplest things, no need to create a method for it nor array things etc. just simple modulus. is there any code which fulfills what i desire?

here is the code for finding simple factors, i need this code to be modified to calculate prime factors

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();



    }
}
Vilx-
  • 101,209
  • 85
  • 267
  • 409
Aliza
  • 151
  • 1
  • 1
  • 4
  • 3
    It should be simple enough to write yourself. Which bit are you stuck on - what do you need help with? – Rup May 03 '11 at 16:59
  • i tried so many codes but none of them working, suppose if 10 prime factors are 2 and 5 then its shown in my program as 25...now what is this. – Aliza May 03 '11 at 17:02
  • 1
    can you post some code that you've tried. What do you have so far? – BZink May 03 '11 at 17:03
  • Theres a good overview of algorithms on this question [here](http://stackoverflow.com/questions/23287/prime-factors). – Matt May 03 '11 at 17:03
  • Showing 25 not 2 and 5 - are you just using `Console.Write(factor);`? You might want to write a space between the numbers `Console.Write(' ');`, or use Console.WriteLine, or something else. – Rup May 03 '11 at 17:05
  • the 25 value is stored in factor, and i cant seperate it – Aliza May 03 '11 at 17:06
  • Uh, that shouldn't happen. You'd have to jump through hoops to make that happen. You'll need to edit the question and add in your code to show us what you're doing. – Rup May 03 '11 at 17:07
  • now just see my code which i posted above for finding simple factors, i need that code to modified in such a way that it calculates prime factors. – Aliza May 03 '11 at 17:10
  • OK, so how are you going to test for primality? You can either generate primes up to your integer first, or for each new number b you can try dividing it by all primes you've discovered so far to see if it's prime itself or - if you don't want to keep a list and are happy with an inefficient solution - you can try dividing it by all of 2 to b/2 to see if it's prime first. – Rup May 03 '11 at 17:25
  • 2
    Is this a homework, by the way? – Vilx- May 03 '11 at 19:27

6 Answers6

50
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!");

Works on my machine!

AustinWBryan
  • 3,081
  • 3
  • 18
  • 38
Vilx-
  • 101,209
  • 85
  • 267
  • 409
  • You'll need to tell us what the error is. (This will eliminate repeated factors, BTW, not filter it down to primes - and you might want to show when a prime factor is repeated?) Actually your code shows 1 as a factor - is the error that it's stuck in an infinite loop trying to factor out 1? 1 will never be a prime factor so it might be easier to start your loop at 2, but you do need to do the prime filtering too. – Rup May 03 '11 at 17:21
  • 34
    super upvote for works on my machine badget, I'm stealing this. – Chris Marisic May 03 '11 at 19:33
  • @Chris Marisic - it's an [old thing](http://www.codinghorror.com/blog/2007/03/the-works-on-my-machine-certification-program.html) that never grows old. :) – Vilx- May 03 '11 at 19:52
  • @ChrisMarisic upvote to his post and your comment. That's genius ! – gilles emmanuel Sep 03 '14 at 23:07
4
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;
}

If you want to learn steps of development you can watch video here.

AustinWBryan
  • 3,081
  • 3
  • 18
  • 38
  • 2
    The divisor can never be larger than number / 2, so you could optimise by writing: for(int div = 2; div<=number / 2; div++){ – stevieg Apr 24 '16 at 06:57
4

You can go one better as the divisor can never be larger than the square root of the number.

 for(int div = 2; div <= Math.Sqrt(number); div++)
AustinWBryan
  • 3,081
  • 3
  • 18
  • 38
  • but after end of `for` you must add `number` to `primes` ... `if (number > 1) primes.Add(number);` – Cyrus Jan 06 '19 at 08:03
1

Try this code (I incorporated various solutions in this code). Although, interpolation is not in 2005 (I think so....)

So, anyways, try this:

// 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();
        }

    }
}
Andrew Fan
  • 1,287
  • 5
  • 18
  • 27
Koroshiya
  • 35
  • 1
  • 7
0

This version lists all the factors as an explicit formula:

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());
        }
    }
Valid
  • 717
  • 6
  • 11
-1
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;
        }
    }
}
  • 3
    Please consider explaining your answer outside of just providing the code necessary to solve the problem. – Bender the Greatest Apr 13 '20 at 16:13
  • Found this definition @ wikipedia on prime numbers. Prime numbers starts from 2 and then IsPrime(number) method loops through all numbers starting from 2 but less than the given number to check for a number that can divide the given number without a remainder.. – Vincent Amoako-Ampofo Apr 14 '20 at 21:59
  • This code does not answer the question. It prints all prime numbers from 0 to 19, not the prime factors of a number. It is also very inefficient. – Bip901 Feb 03 '21 at 12:41