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

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

Помогите пожалуйста решить задачу 1086 на C#
Послано oleg.dudrov 16 апр 2011 17:47
на языке программирования С получается так

#include <stdio.h>

#define MAXK 15001

int pn = 0, p[MAXK];

int IsP( int x )
{
  int i;

  for (i = 2; i * i <= x; i++)
    if (x % i == 0)
      return 0;
  return 1;
}

int main()
{
  int n, i;

  for (i = 2; pn < MAXK; i++)
    if (IsP(i))
      p[pn++] = i;

  scanf("%d", &n);
  while (n--)
  {
    scanf("%d", &i);
    printf("%d\n", p[i - 1]);
  }
  return 0;
}

на языке программировании java, код получается

#include <stdio.h>

#define MAXK 15001

int pn = 0, p[MAXK];

int IsP( int x )
{
  int i;

  for (i = 2; i * i <= x; i++)
    if (x % i == 0)
      return 0;
  return 1;
}

int main()
{
  int n, i;

  for (i = 2; pn < MAXK; i++)
    if (IsP(i))
      p[pn++] = i;

  scanf("%d", &n);
  while (n--)
  {
    scanf("%d", &i);
    printf("%d\n", p[i - 1]);
  }
  return 0;
}



Edited by author 16.04.2011 18:04
Re: Помогите пожалуйста решить задачу 1086 на C#
Послано oleg.dudrov 16 апр 2011 18:05
Помогите пожалуйста, если можете пришлите по мылу Oleg.90@inbox.ru
Re: Помогите пожалуйста решить задачу 1086 на C#
Послано oleg.dudrov 16 апр 2011 18:22
И вот еще на C++

#include<iostream>
#include<vector>
using namespace std;
vector<int>a;
bool is_prime (int n) {
if (n<=1) return 0;
if (n==2) return true;
if (!(n%2)) return false;
for (int i=2;i*i<=n;i++) if (!(n%i)) return 0;
return 1;
}
void primes () {
a.push_back(2);
int i=3,br=1;
for (;br<15001;i+=2) if (is_prime(i)) {br++;a.push_back(i);}
}
int main () {
int n,k;
primes();
cin>>n;
for (int i=0;i<n;i++) {scanf("%d",&k);printf("%d\n",a[k-1]);}
return 0;
}

Edited by author 16.04.2011 18:22

Edited by author 16.04.2011 18:22
Re: Помогите пожалуйста решить задачу 1086 на C#
Послано oleg.dudrov 16 апр 2011 23:18
using System;
using System.Diagnostics;

class Simple
{
    static void Main()
    {
        const int limit = 163842;   // 163841 - максимальное простое число для предела в 15к (+1 - для размера массива)
        int k = 0;                  // Кол-во вводимых чисел
        int i;

        Console.Write("Количество вводимых чисел: ");
        int.TryParse(Console.ReadLine(), out k);
        k = k < 1 ? 1 : k;

        // Массив входных данных
        var inputData = new int[k];

        // Вводим данные
        Console.WriteLine("Введите данные:");
        for (i = 0; i < k; i++)
        {
            int digit = 0;
            int.TryParse(Console.ReadLine(), out digit);

            if (digit < 1 || digit > 15000)
                digit = 1;

            inputData[i] = digit;
        }

        // Замеряем память
        var currentProcess = Process.GetCurrentProcess();
        var memStartPoint = currentProcess.PeakVirtualMemorySize64;

        // Замеряем время
        var sw = new Stopwatch();
        sw.Start();

        // Решето Эратосфена для поиска простых чисел
        Console.WriteLine("--------");
        Console.WriteLine("Результаты:");
        for (var n = 0; n < k; n++)
        {
            int j;
            var table = new bool[limit];

            // Отмечаем все числа как простые
            for (i = 0; i < table.Length; i++)
                table[i] = true;

            // Вычеркиваем лишнее
            for (i = 2; i * i < table.Length; i++)
                if (table[i])
                    for (j = 2 * i; j < table.Length; j += i)
                        table[j] = false;

            int cnt = 0;
            // Выводим найденное
            for (i = 2; i < table.Length; i++)
            {
                if (table[i])
                {
                    cnt++;
                    if (inputData[n] == cnt)
                    {
                        Console.WriteLine("Входное число: {0}, простое число = {1}.", inputData[n], i);
                        break;
                    }
                }
            }
        }

        Console.WriteLine("--------");

        sw.Stop();
        var time = Math.Round(sw.ElapsedMilliseconds / 60.0, 3);
        Console.WriteLine("Время исполнения: {0} сек.", time);

        var memUse = currentProcess.PeakVirtualMemorySize64 - memStartPoint;
        Console.WriteLine("Процесс определения простых чисел занял {0} дополнительных Мб памяти.", memUse / 1024.0 / 1024.0);
        Console.ReadLine();
    }
}
Re: Помогите пожалуйста решить задачу 1086 на C#
Послано oleg.dudrov 17 апр 2011 10:18
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public class Atkin : IEnumerable<ulong>
{
    public readonly List<ulong> Primes;
    private readonly ulong _limit;

    public Atkin(ulong limit)
    {
        this._limit = limit;
        Primes = new List<ulong>();
    }

    public IEnumerator<ulong> GetEnumerator()
    {
        if (!Primes.Any())
            FindPrimes();

        foreach (var p in Primes)
            yield return p;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public void FindPrimes()
    {
        var isPrime = new bool[_limit + 1];
        var sqrt = Math.Sqrt(_limit);

        for (ulong x = 1; x <= sqrt; x++)
            for (ulong y = 1; y <= sqrt; y++)
            {
                var n = 4 * x * x + y * y;
                if (n <= _limit && (n % 12 == 1 || n % 12 == 5))
                    isPrime[n] ^= true;

                n = 3 * x * x + y * y;
                if (n <= _limit && n % 12 == 7)
                    isPrime[n] ^= true;

                n = 3 * x * x - y * y;
                if (x > y && n <= _limit && n % 12 == 11)
                    isPrime[n] ^= true;
            }

        for (ulong n = 5; n <= sqrt; n++)
            if (isPrime[n])
            {
                var s = n * n;
                for (ulong k = s; k <= _limit; k += s)
                    isPrime[k] = false;
            }

        Primes.Add(2);
        Primes.Add(3);
        for (ulong n = 5; n <= _limit; n += 2)
            if (isPrime[n])
                Primes.Add(n);
    }
}

class Simple
{
    static void Main()
    {
        Atkin atkin = new Atkin(163842);
        atkin.FindPrimes();

        int k = int.Parse(Console.ReadLine());
        int[] input = new int[k];

        for (int i = 0; i < k; i++)
            input[i] = int.Parse(Console.ReadLine());

        foreach (var i in input)
            Console.WriteLine(atkin.Primes[i - 1]);
    }
}

Рабочий код на C#