ENG  RUSTimus Online Judge
Online Judge
Problems
Authors
Online contests
About Online Judge
Frequently asked questions
Site news
Webboard
Links
Problem set
Submit solution
Judge status
Guide
Register
Update your info
Authors ranklist
Current contest
Scheduled contests
Past contests
Rules
back to board

Discussion of Problem 1086. Cryptography

Помогите пожалуйста решить задачу 1086 на C#
Posted by oleg.dudrov 16 Apr 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#
Posted by oleg.dudrov 16 Apr 2011 18:05
Помогите пожалуйста, если можете пришлите по мылу Oleg.90@inbox.ru
Re: Помогите пожалуйста решить задачу 1086 на C#
Posted by oleg.dudrov 16 Apr 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#
Posted by oleg.dudrov 16 Apr 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#
Posted by oleg.dudrov 17 Apr 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#