Основные факторы в C #

Я хочу создать программу на 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();



    }
}

person Aliza    schedule 03.05.2011    source источник
comment
Это должно быть достаточно просто, чтобы написать самому. На каком бите вы застряли - в чем вам нужна помощь?   -  person Rup    schedule 03.05.2011
comment
Я пробовал так много кодов, но ни один из них не работал, предположим, что если 10 простых множителей равны 2 и 5, то в моей программе он отображается как 25 ... что это теперь?   -  person Aliza    schedule 03.05.2011
comment
Можете ли вы опубликовать код, который вы пробовали. Что у вас есть на данный момент?   -  person BZink    schedule 03.05.2011
comment
Хороший обзор алгоритмов по этому вопросу есть здесь.   -  person Matt    schedule 03.05.2011
comment
Показано 25, а не 2 и 5 - вы просто используете Console.Write(factor);? Вы можете написать пробел между числами Console.Write(' ');, использовать Console.WriteLine или что-то еще.   -  person Rup    schedule 03.05.2011
comment
значение 25 хранится в факторе, и я не могу его разделить   -  person Aliza    schedule 03.05.2011
comment
Этого не должно происходить. Чтобы это произошло, вам придется перепрыгивать через обручи. Вам нужно будет отредактировать вопрос и добавить в свой код, чтобы показать нам, что вы делаете.   -  person Rup    schedule 03.05.2011
comment
теперь просто посмотрите мой код, который я опубликовал выше для поиска простых факторов, мне нужно, чтобы этот код был изменен таким образом, чтобы он вычислял простые коэффициенты.   -  person Aliza    schedule 03.05.2011
comment
Итак, как вы собираетесь проверять примитивность? Вы можете либо сначала сгенерировать простые числа до вашего целого числа, либо для каждого нового числа b вы можете попробовать разделить его на все простые числа, которые вы обнаружили до сих пор, чтобы увидеть, является ли оно само по себе простым или - если вы не хотите вести список и довольны неэффективным решением - вы можете попробовать разделить его на все 2 до b / 2, чтобы увидеть, будет ли оно первым.   -  person Rup    schedule 03.05.2011
comment
Кстати, это домашнее задание?   -  person Vilx-    schedule 03.05.2011


Ответы (6)


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

Работает на моей машине!

person Vilx-    schedule 03.05.2011
comment
Вам нужно будет сообщить нам, в чем заключается ошибка. (Это устранит повторяющиеся факторы, кстати, а не фильтрует их до простых чисел - и вы, возможно, захотите показать, когда повторяется простой коэффициент?) На самом деле ваш код показывает 1 как коэффициент - это ошибка, заключающаяся в том, что он застрял в бесконечном цикле, пытаясь вычесть 1? 1 никогда не будет основным множителем, поэтому, возможно, будет проще начать цикл с 2, но вам также необходимо выполнить первичную фильтрацию. - person Rup; 03.05.2011
comment
супер голос за работы на моем машинном значке, я краду это. - person Chris Marisic; 03.05.2011
comment
@Chris Marisic - это старая вещь, которая никогда не стареет. :) - person Vilx-; 03.05.2011
comment
@ChrisMarisic проголосовал за его сообщение и ваш комментарий. Это гениально! - person gilles emmanuel; 04.09.2014

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;
}

Если вы хотите узнать об этапах разработки, вы можете здесь

person Bayram Üçüncü    schedule 28.01.2016
comment
Делитель никогда не может быть больше числа / 2, поэтому вы можете оптимизировать, написав: for (int div = 2; div ‹= number / 2; div ++) { - person stevieg; 24.04.2016

Вы можете пойти лучше, поскольку делитель никогда не может быть больше квадратного корня из числа.

 for(int div = 2; div <= Math.Sqrt(number); div++)
person John Conacher    schedule 19.09.2016
comment
но после окончания for вы должны добавить number к primes ... if (number > 1) primes.Add(number); - person Cyrus; 06.01.2019

Попробуйте этот код (я включил в этот код различные решения). Хотя, интерполяции нет в 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();
        }

    }
}
person Koroshiya    schedule 16.05.2019

В этой версии все факторы перечислены в виде явной формулы:

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());
        }
    }
person Valid    schedule 08.03.2017

person    schedule
comment
Пожалуйста, подумайте о том, чтобы объяснить свой ответ, помимо кода, необходимого для решения проблемы. - person Bender the Greatest; 13.04.2020
comment
Нашел это определение @ википедии на простых числах. Простые числа начинаются с 2, а затем метод IsPrime (number) перебирает все числа, начиная с 2, но меньше заданного числа, чтобы найти число, которое может разделить данное число без остатка. - person Vincent Amoako-Ampofo; 15.04.2020
comment
Этот код не отвечает на вопрос. Он печатает все простые числа от 0 до 19, а не простые множители числа. К тому же это очень неэффективно. - person Bip901; 03.02.2021