Программа подсчета простых множителей С# с применением методов

136
17 апреля 2022, 19:40

Подскажите, что не так в моем коде. "К" не хочет брать на себя значение функции. Буду очень благодарен, если поможете :-)

//12. Дано натуральное число N. Составить функцию, значение которой будет
//равно количеству различных простых множителей заданного числа.
using Microsoft.VisualBasic;
using System;
namespace LR7_Paskhin
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {      
                int N; int k;
                k = 0;
                Console.WriteLine("Введите N");
                N = int.Parse(Console.ReadLine());
                int S = N;
                if (N > 1)
                {
                    Mnozhiteli(N,k);
                    
                }
                Console.WriteLine("Количество множителя числа {0}:{1}", N, k);
            }
            catch
            {
                Console.WriteLine("error");
            }
            
        }
        static int Mnozhiteli( int N,  int k)
        {  try
            {   
                Console.WriteLine("{0}",N);
                int i; 
                i = 1; // Множитель числа
                k = 0;    // Счетчик простых множителей
                while (i < N )
                {
                    Console.WriteLine(i);
                    if (N % i == 0)
                    {
                        ++i;
                    }
                    ++k;
                    Console.WriteLine(k);
                    if (i <=N)
                    { break; }
                }
                return k;
            }
            catch
            {
                Console.WriteLine("error");
            }
        
          
        } 
    }
}
                       
Answer 1

В качестве решения вашей задачи можно предложить следующий код:

    private static void Main(string[] args)
    {
        Console.Write("Введите N: ");
        int number;
        if (int.TryParse(Console.ReadLine(), out number))
        {
            if (number > 1)
            {
                var count = Mnozhiteli(number);
                Console.WriteLine($"Количество множителя числа {number}: {count}");
            }
            else
            {
                Console.WriteLine("N должно быть больше 1");
            }
        }
        else
        {
            Console.WriteLine("Введенное значение не является числом");
        }
    }
    private static int Mnozhiteli(int N)
    {
        var result = 0;
        for (var i = 1; i <= N; i++)
        {
            if (N % i == 0 && IsSimple(i))
            {
                result++;
                Console.WriteLine(i);
            }
        }
        return result;
    }
    
    /// <summary>
    /// Возвращает True, если число number является простым.
    /// </summary>
    private static bool IsSimple(int number)
    {
        for (var i = 2; i < number; i++)
        {
            if (number % i == 0)
                return false;
        }
        return number != 1;
    }
Answer 2

Я, кажется, знаю, что не так в Вашем коде:

  1. Вы пишите:
 while (i < N )
 {
 ...
 if (i <=N){ break; } // Зачем тут это? У вас же while и так выйдет когда надо.
 }
  1. В том же цикле, тут:
 while (i < N )
                {
                    Console.WriteLine(i);
                    if (N % i == 0)
                    {
                        ++i;
                    }
                    ++k;
}

Вы берете остаток от деления исходного числа на i и увеличиваете i на 1. То есть на 4 итерации i = 4 не простому числу, а нужно найти простые множители.

  1. Тот же код: Почему у Вас k прибавляется вне зависимости от условия прибавляется? В связке с ошибкой 2 Ваш счетчик будет считать не только все множители, а и каждый проход цикла while.

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

  1. Смотрим на N и принимаем его в качестве граничного числа.
  2. Ищем все простые числа до граничного. Самый простой способ решето Эратосфена, формируем из них массив делителей.
  3. В цикле берем остаток от деления N на каждый элемент массива. Если остаток — ноль, то ++k

Могу добавить код, но думаю Вы и сами сможете реализовать алгоритм.

READ ALSO
Эллиптическая кривая- сложение двух точек C#

Эллиптическая кривая- сложение двух точек C#

Помогите с вопросом почему консоль выводит ? где ошибка?

184
Как сделать активными только определенные дни недели в DatePicker

Как сделать активными только определенные дни недели в DatePicker

Я получаю порядковые номера определенных дней недели из базы данных и эти дни должны оставаться активными в DatePicker, а все остальные - нетНо...

239
Как увеличить offset для elasticsearch?

Как увеличить offset для elasticsearch?

Эластик имеет настройку indexmax-result-window по дефолту равную 10000, поэтому при запросе с offset > 10000, я получаю ошибку

160
Возможно ли отправить в БД тип данных object?

Возможно ли отправить в БД тип данных object?

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

138