Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
toshiba
0 / 0 / 0
Регистрация: 26.03.2009
Сообщений: 5
#1

Простые сомножители - C++

26.03.2009, 19:11. Просмотров 1436. Ответов 4
Метки нет (Все метки)

Привет всем тут такой вопрос:
Задача сосит в следуюшел Простые сомножители. Любое натуральное число может быть единственным образом разложено на простые сомножители. Напишите программу для выполнения такого разложения всех натуральных чисел от N1 до N2 с использованием рекурсивной программы. Вродибы просто но что то не получается организовать наведите на путь истины)))))))))))

Добавлено через 8 минут 10 секунд
С++/DOS
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2009, 19:11     Простые сомножители
Посмотрите здесь:

C++ Вынести общие сомножители из суммы
Простые числа. C++
простые числа C++
C++ Простые числа
C++ Простые сомножители
Простые числа C++
C++ Найти все трехзначные простые числа. Определить функцию позволяющую распознавать простые числа
Как научиться создавать на C++ простые приложения (очень простые игры)? C++
простые числа! C++
простые C++
Простые числа C++
Задача про простые числа. Выпишите все простые числа, находящиеся в интервале между а и б C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deicider
96 / 52 / 1
Регистрация: 18.03.2009
Сообщений: 273
26.03.2009, 19:41     Простые сомножители #2
Код в студию! Тогда и разберемся, почему не получается
toshiba
0 / 0 / 0
Регистрация: 26.03.2009
Сообщений: 5
26.03.2009, 19:42  [ТС]     Простые сомножители #3
я бы дал код но я незнаю с чего начать вот и прошу подсказать)
Deicider
96 / 52 / 1
Регистрация: 18.03.2009
Сообщений: 273
26.03.2009, 19:53     Простые сомножители #4
Есть такая идея:
Создать функцию для разложения числа на два сомножителя. Далее рекурсивно передавать в эту функцию результаты разложения. В случае, если разложить полученное число уже невозможно, выводить его на экран (то есть добрались до простого сомножителя) и осуществлять выход из функции. Возможность разложения проверять функцией нахождения остатка от деления.

Код пока написать не могу, компилятор не под рукой
toshiba
0 / 0 / 0
Регистрация: 26.03.2009
Сообщений: 5
26.03.2009, 21:15  [ТС]     Простые сомножители #5
спс большое буду пробовать если сможешь потом напиши код) когда сделаю если получится сам скину !!! еще раз спасибо

Добавлено через 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
Буду очень благодарен
Yandex
Объявления
26.03.2009, 21:15     Простые сомножители
Ответ Создать тему
Опции темы

Текущее время: 17:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru