ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1086. Криптография

Accepted c#
Послано RolJan 15 май 2018 18:16
using System;
using System.Collections.Generic;
namespace Timus
{
    public class Program
    {
        static void Main(string[] args)
        {
            Cryptography_1086 firstSolution = new Cryptography_1086();
            firstSolution.CalculatePrimes();
            firstSolution.GetNumbersFromInput();
            //firstSolution.GetNumbersFromInputForTests(15000);
            firstSolution.FindPrimesAndListInConsole();
        }

    }
    public class Cryptography_1086
    {
        int numbersAmount_k = 0;
        int currentPrimeNumberValue = 2;
        const int maxNumberValue = 15001;
        public List<int> PrimeNumbersList { get; set; }
        public List<int> SearchedPrimeNumbersIndexes { get; set; }

        public Cryptography_1086()
        {
            PrimeNumbersList = new List<int>();
            SearchedPrimeNumbersIndexes = new List<int>();
            PrimeNumbersList.Add(currentPrimeNumberValue);
            PrimeNumbersList.Add(++currentPrimeNumberValue);
        }

        public void CalculatePrimes()
        {
            while (PrimeNumbersList.Count <= maxNumberValue) {
                if (IsPrime(++currentPrimeNumberValue)) {
                    PrimeNumbersList.Add(currentPrimeNumberValue);
                }
            }
        }
        public bool IsPrime(int number)
        {
            if (number % 2 == 0 || number % 3 == 0)
                return false;

            int i = 5;

            while (i * i <= number) {
                if (number % i == 0 || number % (i + 2) == 0)
                    return false;

                i += 6;
            }
            return true;
        }

        public void GetNumbersFromInput()
        {
            Int32.TryParse(Console.ReadLine(), out numbersAmount_k);
            if (numbersAmount_k > 0) {
                int counter = 1;
                int numberOfPrimeNumber_n = 0;
                while (counter <= numbersAmount_k) {

                    if (Int32.TryParse(Console.ReadLine(), out numberOfPrimeNumber_n)
                        && numberOfPrimeNumber_n > 0
                        && numberOfPrimeNumber_n < PrimeNumbersList.Count) {

                        SearchedPrimeNumbersIndexes.Add(numberOfPrimeNumber_n - 1);
                        ++counter;
                    }
                    else {
                        Console.WriteLine("Please enter valid number, n > 0 && n < " + PrimeNumbersList.Count);
                    }
                }
            }
            else {
                Console.WriteLine("Please enter valid number, k > 0");
                GetNumbersFromInput();
            }
        }


        public void GetNumbersFromInputForTests(int numbersAmount_k)
        {
            int counter = 1;
            int numberOfPrimeNumber_n = 0;
            while (counter <= numbersAmount_k) {

                Console.WriteLine(numberOfPrimeNumber_n);
                SearchedPrimeNumbersIndexes.Add(numberOfPrimeNumber_n++);
                ++counter;
                Console.WriteLine(numberOfPrimeNumber_n);
            }
            Console.ReadKey();
        }

        public void FindPrimesAndListInConsole()
        {
            foreach (var searchedIndex in SearchedPrimeNumbersIndexes) {
                Console.WriteLine(PrimeNumbersList[searchedIndex]);
            }
        }
    }
}