спс большое буду пробовать если сможешь потом напиши код) когда сделаю если получится сам скину !!! еще раз спасибо
Добавлено через 1 час 17 минут 3 секунды
Есть код
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
| using System;
using System.Collections.Generic;
using System.Text;
namespace KultiHELL
{
class Ferma
{
private Int32[] factors; // Массив в который будут писацца множители
private Int16 next = 1; // Следующий индекс массива
public Int32[] Factoring(Int32 n)
{
Int16 i_max = (Int16)Math.Floor(Math.Log(n, 2)); // Максимальное колво множителей
factors = new Int32[i_max+1];
factors[0] = n;
int i = 0;
Boolean exit = false;
while(!exit)
{
if ((factors[next] = FermaMetod(ref factors[i])) != 0) // Если разложилось, то
next++; // пробуем разложить число на том же индексе
else // Если число простое, то можно брать следующее
if (++i == i_max) // Если весь массив "заполнен", то выходим
exit = true;
}
int newSize = 0;
for(;newSize == 0;i--) // Уменьшаем индекс, как только найдем ненулевой
if (factors[i] != 0) newSize = i + 1; // элемент пербор будет закончен
Array.Resize<Int32>(ref factors, newSize); // Обрезаем нули
Array.Sort(factors); // Сортируем в порядке возрастания
return factors;
}
private Int32 FermaMetod(ref Int32 n)
{ // Метод Ферма. Смотри описание в "Description.pdf"
if (n <= 2 )
return 0;
if (n == 2 * (n / 2)) // Проверка на четность
{
n = n / 2;
return 2;
}
Int32 x = 1 + 2 * Convert.ToInt32(Math.Floor(Math.Sqrt(n)));
Int32 y = 1;
Int32 r = Convert.ToInt32(Math.Pow(Math.Floor(Math.Sqrt(n)), 2)) - n;
Int32 q = (Int32)n / 2;
Boolean exit = false;
Byte state = 2;
while (!exit)
{
switch (state)
{
case 2:
if (r <= 0)
state = 4;
else
state = 3;
break;
case 3:
r -= y;
y += 2;
if (y > q)
return 0; // Возвращаем ноль, если число простое.
else
state = 2;
break;
case 4:
if (r == 0)
exit = true; // Найдены сомножители!
else
{
r += x;
x += 2;
state = 3;
}
break;
}
}
// Возвращаем первый сомножитель, а через ссылку второй.
n = (x - y) / 2;
return (x + y - 2) / 2;
}
}
} |
|
для решения задачи:
Простые сомножители. Любое натуральное число может быть единственным образом разложено на простые сомножители. Напишите программу для выполнения такого разложения всех натуральных чисел от N1 до N2 с использованием рекурсивной программы. Только без рекурсии
Кто может помоч этот код перевести в C++/DOS
Буду очень благодарен