C#

Помогите пожалуйста. Написать на C#

Приветствую. Прошу шарющих пожалуйста сделать программу наc C#
Разработать метод, который для заданного натурального числа находит количество простых
множителей. С помощью данного метода:
a) для каждого целого числа на отрезке [a, b] вывести на экран количество его простых
множителей;
b) на отрезке [a, b] найти все числа, имеющие наибольшее количество простых множителей;
c) на отрезке [a, b] найти все числа, количество простых множителей которого равно числу С;
d) для заданного числа А вывести на экран ближайшее следующее за ним число, количество
простых множителей которого равна количеству простых множителей числа А
using System;
using System.Collections.Generic;
using System.Linq;
namespace Answer {
class Program {
static void Main() {
Console.Write("Введите число a: ");
var a = uint.Parse(Console.ReadLine());
Console.Write("Введите число b: ");
var b = uint.Parse(Console.ReadLine());
Console.WriteLine();
taskA(a, b);
taskB(a, b);
taskC(a, b);
taskD();
Console.ReadKey();
}
static void taskA(uint a, uint b) {
Console.WriteLine("Задача A:");
for (var x = a; x <= b; ++x) {
var box = FindingPrimeDivisors(x);
if (box.Length != 0) {
Console.Write($"{x}:");
foreach (var n in box) Console.Write($" {n}");
Console.WriteLine();
}
}
Console.WriteLine();
}
static void taskB(uint a, uint b) {
Console.WriteLine("Задача B:");
var dic = new Dictionary<uint, uint>();
for (var x = a; x <= b; ++x) {
var box = FindingPrimeDivisors(x);
if (box.Length != 0) {
foreach (var n in box) {
if (dic.ContainsKey(x)) ++dic[x];
else dic.Add(x, 1);
}
}
}
var max = dic.Values.Max();
Console.Write("Числа:");
foreach (var item in dic) {
if (item.Value == max) {
Console.WriteLine($" {item.Key}");
}
}
Console.WriteLine();
}
static void taskC(uint a, uint b) {
Console.WriteLine("Задача C:");
Console.Write("Введите число C: ");
var c = uint.Parse(Console.ReadLine());
var dic = new Dictionary<uint, uint>();
for (var x = a; x <= b; ++x) {
var box = FindingPrimeDivisors(x);
if (box.Length != 0){
foreach (var n in box) {
if (dic.ContainsKey(x)) ++dic[x];
else dic.Add(x, 1);
}
}
}
Console.Write("Числа:");
foreach (var item in dic) {
if (item.Value == c) {
Console.Write($" {item.Key}");
}
}
Console.WriteLine("\n");
}
static void taskD() {
Console.WriteLine("Задача D:");
Console.Write("Введите число A: ");
var a = uint.Parse(Console.ReadLine());
var box = FindingPrimeDivisors(a);
uint[] next;
var x = a;
do {
next = FindingPrimeDivisors(++x);
} while (box.Length != next.Length);
Console.WriteLine($"Число: {x}");
}
static bool IsPrime(uint x) {
bool p;
if (x <= 5U && (x <= 2U || x == 3U || x == 5U)) p = true;
else if (0U == x % 2U || 0U == x % 3U || 0U == x % 5U) p = false;
else {
uint n;
for (n = 3U; n * n <= x && 0U != x % n; n += 2U) {; }
p = n * n > x;
}
return p;
}
static bool IsDivider(uint x, uint y) {
return 0U == x % y;
}
static uint[] FindingPrimeDivisors(uint x) {
var box = new List<uint>();
while (IsDivider(x, 2U)) {
box.Add(2U);
x /= 2U;
}
var n = 3U;
while (!IsPrime(x)) {
while (IsDivider(x, n)) {
box.Add(n);
x /= n;
}
n += 2U;
while (!IsPrime(n)) n += 2U;
}
return box.ToArray();
}
}
}
Azizbek Xudoyberganov
Azizbek Xudoyberganov
83 133
Лучший ответ
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp4
{
class Program
{
static int[] GetPrimeDivisors(int num)
{
var max = (int)Math.Sqrt(num);
for (int i = 2; i <= max; i++)
if (num % i == 0)
return GetPrimeDivisors(num / i).Concat(new int[] { i }).ToArray();
return new int[] { num };
}

static void Main()
{
void WriteTask(string description, IEnumerable result)
=> Console.WriteLine($"{description}\r\n>\t{(result.Count() > 0? string.Join(", ", result) : "нет значений")}\r\n");

int TryGetIntValue(string description)
{
int value = 0;
Console.Write(description);
while (!int.TryParse(Console.ReadLine(), out value) || value < 1)
{
Console.SetCursorPosition(Console.CursorLeft, Console.CursorTop);
Console.Write(description); ;
}
return value;
}

int a = TryGetIntValue("Задайте значение переменной a: ");
int b = TryGetIntValue("Задайте значение переменной b: ");

if (b > a)
{
var valuesRange = Enumerable.Range(a, b - a + 1).Select(x => (Value: x, Divisors: GetPrimeDivisors(x))).ToArray();

WriteTask("\r\n\r\nдля каждого целого числа на отрезке [a, b] вывести на экран количество его простых множителей:",
valuesRange.Select(x => x.Divisors.Count()));

WriteTask("на отрезке [a, b] найти все числа, имеющие наибольшее количество простых множителей:",
valuesRange.GroupBy(x => x.Divisors.Count()).OrderByDescending(x => x.Key).First().Select(x => x.Value));

int c = TryGetIntValue("Задайте значение переменной c: ");

WriteTask("на отрезке [a, b] найти все числа, количество простых множителей которого равно числу С:",
valuesRange.Where(x => x.Divisors.Count() == c).Select(x => x.Value));

WriteTask("для заданного числа А вывести на экран ближайшее следующее за ним число, " +
"количество простых множителей которого равна количеству простых множителей числа А: ",
valuesRange.GroupBy(x => x.Divisors.Count()).First().Skip(1).Take(1).Select(x => x.Value));
}
else
Console.WriteLine("\r\n\tЗначение числа b, должно быть больше числа а.");

Console.ReadKey(false);
}
}
}
ОК
Олег Купцов
2 054