Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2011, 19:41   #1
Stasiksis
Пользователь
 
Регистрация: 12.09.2011
Сообщений: 19
Восклицание Программа, вычисляющая наименьшее треугольное число, имеющее более 3000 делителей (на C)

написать надо на С.
Срочно нужно,я не в силах придумать что-либо,кроме простого нудного перебора.
вот условие:
Число x - треугольное,если оно равно сумме n первых натуральных чисел. Например, треугольное число 28=1+2+3+4+5+6+7.
Если выписать все делители первых треугольных чисел,мы получим:
1: 1
3: 1,3
6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28.
Таким образом, 28 - это наименьшее треугольное число, имеющее более 5 делителей.
Нужно составить программу, вычисляющую наименьшее треугольное число, имеющее более 3000 делителей.
Да, еще важным критерием является время подсчета, кто поможет, буду премного благодарен.

______________
Название темы по правилам форума должно адекватно отражать суть решаемой задачи/проблемы.
На первый раз я исправил.
В последующем, темы с подобным названием будут закрываться или удаляться,
а автор такой темы будет получать штрафные баллы.
Учтите это на будущее.

Модератор.

Последний раз редактировалось Serge_Bliznykov; 12.09.2011 в 21:57.
Stasiksis вне форума Ответить с цитированием
Старый 12.09.2011, 19:45   #2
Stasiksis
Пользователь
 
Регистрация: 12.09.2011
Сообщений: 19
По умолчанию

Вот мой код, есть одна проблема,хоть и стоит тип long, программа доходя до значения 2 в 31 степени примерно,крайнее значение типа int, начинает выводить значения с минусом.


Код:
#include <stdio.h>
main()
{
	long  r,c,d,e,i;
	c=0;
	d=0;
	e=1;
	i=1;
	while (d<=3001)
		{
        c=c+i;
            for (e=1;e<=c;e++)
                if (c%e==0)
                    d=d+1;

            if (d<=3000)
                d=0;
            
        i=i+1;
        printf("%ld\n",c); /*Вывод  треугольных чисел*/
        }
    printf("%ld\n",c);
	return 0;
}
________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 12.09.2011 в 21:57.
Stasiksis вне форума Ответить с цитированием
Старый 12.09.2011, 19:55   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
хоть и стоит тип long, программа доходя до значения 2 в 31 степени примерно,крайнее значение типа int
На х86/вин32 int == long вроде. Используйте unsigned тогда уж.

ЗЫ кстати, используйте кнопку # для кода и кнопку правка у сообщения.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 12.09.2011 в 19:58.
Alex11223 вне форума Ответить с цитированием
Старый 12.09.2011, 20:01   #4
Stasiksis
Пользователь
 
Регистрация: 12.09.2011
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
На х86/вин32 int == long вроде. Используйте unsigned тогда уж.

ЗЫ кстати, используйте кнопку # для кода и кнопку правка у сообщения.
я решаю данную задачу на систему Unix 32 bit
Stasiksis вне форума Ответить с цитированием
Старый 12.09.2011, 20:03   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну видимо там также )
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 12.09.2011, 20:04   #6
Stasiksis
Пользователь
 
Регистрация: 12.09.2011
Сообщений: 19
По умолчанию

unsigned не помогает
Stasiksis вне форума Ответить с цитированием
Старый 12.09.2011, 20:23   #7
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Число делителей равно: (a1 + 1)(a2 + 1)...(an + 1) где ai - степени разложения. в общем, тут даже unsigned long long не поможет.
И алгоритм будет считать тыщу лет.

Последний раз редактировалось Carbon; 12.09.2011 в 20:39.
Carbon вне форума Ответить с цитированием
Старый 12.09.2011, 21:00   #8
Stasiksis
Пользователь
 
Регистрация: 12.09.2011
Сообщений: 19
По умолчанию

Carbon, данную задачу возможно решить, и подсчет будет занимать 20 секунд,у преподавателя так.
Stasiksis вне форума Ответить с цитированием
Старый 12.09.2011, 21:04   #9
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

А я разве спорю? Перебор нереально выполнить.
Carbon вне форума Ответить с цитированием
Старый 12.09.2011, 21:09   #10
Stasiksis
Пользователь
 
Регистрация: 12.09.2011
Сообщений: 19
По умолчанию

у кого-нибудь есть идеи?
Stasiksis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа вычисляющая площадь трапеции Visha Помощь студентам 0 18.05.2011 21:59
Где ошибка? треугольное число Juster Помощь студентам 10 01.06.2009 22:36
Найти на отрезке [n, 2n] натуральное число, имеющее наибольшее количество делителей. APTEMUC Паскаль, Turbo Pascal, PascalABC.NET 2 10.12.2008 05:20
Элементарная задача,определить наименьшее число juzam Паскаль, Turbo Pascal, PascalABC.NET 7 26.11.2008 23:53
программа считывающая пять целых чисел и определяющая, печатающая наибольшее и наименьшее число из них Syber Общие вопросы C/C++ 3 30.06.2008 22:39