|
|
вернуться в форумПомогите пожалуйста решить задачу 1086 на C# на языке программирования С получается так #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.90@inbox.ru Re: Помогите пожалуйста решить задачу 1086 на C# И вот еще на 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# 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# 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# |
|
|