![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| parviz |
|
|||
|
Unregistered |
Друзья! У меня такая проблема: надо в обычном С напечатать первые 50 (500) простых чисел. Помогите. Заранее очень благодарю!
|
|||
|
||||
| Parviz |
|
|||
|
Unregistered |
Друзья! У меня такая острая проблема: надо в обычном С напечать первые 50 (500) простых чисел. Как мне быть? помогите. Очень спасибо
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
начинай писать -- а мы поможем.
да и поиском пользоваться не помешает. http://forum.vingrad.ru/index.php?showtopic=15926 -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
в строчке for(i=1;j<10;i++) менаешь количество нузних тепе простых чисел Это сообщение отредактировал(а) LuckLess - 11.12.2004, 16:06 |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
спасибо огромное!
|
|||
|
||||
| Alexandr87 |
|
|||
![]() дыкий псых ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1459 Регистрация: 27.11.2004 Где: Алматы, Казахстан Репутация: 2 Всего: 39 |
LuckLess
Как мне кажется сий код, не будет выводить первые 10 простых чисел, но будет выводить просты числа от 1 до 10 |
|||
|
||||
| Alexandr87 |
|
|||
![]() дыкий псых ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1459 Регистрация: 27.11.2004 Где: Алматы, Казахстан Репутация: 2 Всего: 39 |
должно быть нечто такого
Функции вывода С не знаю сам заменишь Это сообщение отредактировал(а) Alexandr87 - 12.12.2004, 18:24 |
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
Alexandr87
а ты проверь перед тем как говоритрь Добавлено @ 00:48 Скорее всего ты так подумал изза того что в строчке for(i=1;j<10;i++){ ты решил что написано I<10 а не J<10 как у меня. Это сообщение отредактировал(а) LuckLess - 13.12.2004, 00:48 |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
LuckLess
Кстати для того чтоб узнать простое ли число достаточно попытаться разделить его до корня самого числа... примерно вот так..
Немного быстрее получается |
|||
|
||||
| maxim1000 |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
ну и тогда, чтоб не привлекать сюда арифметику с плавающей запятой:
-------------------- qqq |
||||
|
|||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
Спасибо!! Получться не немного а намного быстрее при больших числах. |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
А если посмотреть ту ссылку, которую я дал, то можно сделать еще быстрее. Там умножение заменяется на хитрое сложение и лишний раз ничего не проверяется
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
cardinal
к сожалению VB не знаю човсем , поетому понять там ничекго не смог. И , у меня нигде нет умножения чтоб его заменять сложением... А нащет на сколько быстрее получиться , стало мне интересно , сделал небольшой тест...
Результат ошеломил слегда поначалу... 1-я функция сделала это за 4100 секунд 2-я функция сделала это за 1060 секунд , чего и следовало ожидать.. а 3-я функция сделала это за 2!!!!! секунды. Вобщем правда потом пощитал на бумажке , и понял , что так по идее и должно было быть.. но сразу глазам не поверил Это сообщение отредактировал(а) LuckLess - 14.12.2004, 22:33 |
|||
|
||||
| cardinal |
|
||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 2 Всего: 99 |
Ну деление, без разницы...
Пока все еще думаю, что можно сделать быстрее -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
А почему бы сперва не вырешать b=sqrt(a) и решать: for (i=3;i<=b;i+=2) ? |
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
sergej.z
simp1() медленнее simp() У меня simp() заканчивает за 1.57 секунды , а simp1() за 2.65 |
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
Думаю связано это с тем , что каждое 3-е число делиться на 3 , поэтому для каждого 3-го числа производится только вычисление 3*3 , а если использовать sqrt , то для всех чисел считаеться кв. корень ..
а кто знает , может sqrt медленнее чем 3*3 и 5*5 вместе , тогда для каждого пятого (за исключением каждого третьего каждого пятого который делиться на 3(каждого 15-го т.е.)) 3*3 и 5*5 выполняется быстрее чем sqrt , и есть еще 7.. и т.д... |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Для маленьких чисел получается не выгодно расчитывать корень.
Выгодно для больших, где количество итераций и соотв. выпадающих умножений i*i возмещает затраты на вычисления корня... |
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
sergej.z
для первых 150,000 чисел , как я говорил simp() была быстрее simp1() в 1.71 раз. для первых 1,500,000 в 1.66 раз быстрее , представляешь какими громадными должны быть числа , чтобы simp1() стала быстрее.. счаз пойду в агазин , заставлю его первые 5,000,000 чисел найти.. |
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
хмм.. видимо для 150.000 я не правильно пощитал(слишком округлил) , т.к. для 5,000,000
это соотношение тоже 1,66 (514 и 308 сек соответственно). |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
есть еще такое соображение:
достаточно проверять не делимость числа на все предыдущие (ну или до корня), а на все простые, меньшие корня это не очень хорошо использовать для проверки отдельно взятого числа на простоту, но если уж происходит поиск всех простых чисел, то можно выиграть в скорости...
-------------------- qqq |
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
перепроверил для 150,000 , поличилось 1,688 (2.55 и 1.51 соответственно).
Не увеличивается видимо изза того , что чем больше числа , тем меньше простых чисел . А подщет корня дает заметный выигрыш только на них .. а на каждом третьем , 5-ом и т.д.(до какогото прост. яисла) , дает заметный проигрышь. |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
только я это не проверял
правда, тут проверяются все простые числа меньшие исследуемого для того, чтобы проверять все простые числа, меньшие корня, можно сделать массив квадратов простых чисел и сравнивать их с числом... -------------------- qqq |
|||
|
||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
maxim1000
у тебя 666 сообщений Сдесь функции , которые именно проверяют число на простоту , а выводиться какойто диапазон , только , чтобы проверить ее скорость. И потом , сколько же это будет жрать памяти.... и не факт , что быстрее выйдет.. |
|||
|
||||
| maxim1000 |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
поздно, уже 667... ой, нет, 668
ну не знаю, в заголовке темы написано "первые 50 простых чисел" простые числа встречаются все реже и реже по мере увеличения правой границы диапазона, так что время проверок будет расти медленнее... -------------------- qqq |
||||
|
|||||
| LuckLess |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: 1 Всего: 1 |
maxim1000
Идея супер. Работает реально быстрее. Есть идеи по оптимизации моей реализации твоей идеи(см функ. simp2())??
Добавлено @ 19:00 функция simp() справилась с 1.000.000 числами за 26 сек , а simp2() за 8 сек! |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |