Поиск по сайту
Форумы 
Реклама
|
| Просмотров - 3415
| Помогите решить задачку projecteuler | Добавить этот топик в закладки » | | RSS-лента ответов » |
|
|
Tix

Silver Member | # | Сообщение добавлено 10.04.2010 12:30:07 Отредактировано 11.04.2010 00:43:59 by Tix Самая первая задача:
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
вот мой руби код:
y = 1000/3
f = 1000/5
d.to_f
m.to_f
def probl(a)
y.times do
3 += d
d += x
end
puts x
end
def probl2(a)
f.times do
5 += m
m += z
end
puts z
end
puts probl(y)
puts prob2(f)
ну что тут не правильно??
напишите алгоритм на ООП плз
ICQ:73-81-70 | | Сказать спасибо Ответить Цитировать |
| _ruzmaz_
Gold Member | # | Сообщение добавлено 10.04.2010 13:14:15 Отредактировано 10.04.2010 19:34:58 by _ruzmaz_ А как здесь учитываются числа, делящиеся и на 3, и на 5?
И потом, наверно лучше puts probl2(f) писать в последней строке.
Добавлено 10.04.2010 19:35:11 (через 14 секунд )
С руби как-то не приходилось дело иметь, но все-таки зачем в probl и probl2 какие-то параметры передавать, когда в них уже юзаются y и f глобальные?
Добавлено 10.04.2010 19:35:24 (через 13 секунд )
И кстати, разве x и z не должны быть как-то взаимосвязаны т.к. нужна сумма всех чисел которые делятся на 3 или 5 (в пределах 1000), а не отдельные суммы чисел делящихся на 3 и делящихся 5?
Добавлено 10.04.2010 19:35:42 (через 19 секунд )
К тому же x и z стоит наверно определять глобально перед probl и probl2 и одну из них инициализировать нулем. | | Сказать спасибо Ответить Цитировать |
| Tix

Silver Member | # | Сообщение добавлено 11.04.2010 00:48:41 А как здесь учитываются числа, делящиеся и на 3, и на 5?
И потом, наверно лучше puts probl2(f) писать в последней строке.
ну да, это просто описка
С руби как-то не приходилось дело иметь, но все-таки зачем в probl и probl2 какие-то параметры передавать, когда в них уже юзаются y и f глобальные?
вот я и незнаю.. можно ли менять те переменные или они такимиже при выхоже и остануться...
И кстати, разве x и z не должны быть как-то взаимосвязаны т.к. нужна сумма всех чисел которые делятся на 3 или 5 (в пределах 1000), а не отдельные суммы чисел делящихся на 3 и делящихся 5?
блин.. точно.. этот алгоритм не подходит...
К тому же x и z стоит наверно определять глобально перед probl и probl2 и одну из них инициализировать нулем.
вроде в руби этого можно и не делать..
............................................
напишите мне алгоритм на любом языке, лучше на питоне или пхп
... или на русском
ICQ:73-81-70 | | Сказать спасибо Ответить Цитировать |
| _ruzmaz_
Gold Member | # | Сообщение добавлено 11.04.2010 01:55:47 Tix:
... или на русском
... или на руби))
def sumfunc(n, m)
return 0 if (n < 1) or (m < 1) or (n >= m)
s = 0
s_ = 0
k = m/n
if m%n == 0
k -= 1
end
k.times do
s_ += n
s += s_
end
return s
end
print sumfunc(3, 1000) + sumfunc(5, 1000) - sumfunc(3*5, 1000)
| | Сказать спасибо Ответить Цитировать |
| Actor

Advanced Member | # | Сообщение добавлено 11.04.2010 14:20:24 Отредактировано 12.04.2010 01:10:11 by Actor
#include <iostream.h>
#include <conio.h>
int main()
{
int n = 1000;
int sum = 0;
for (int i = 3; i < n; i++) if (!(i % 3) || !(i % 5)) sum += i;
cout << "sum = " << sum;
getch();
return 0;
}
вроде так, но код никуда не подставлял, могут выскочить косяки
первый косяк исправил. теперь подумаю над лучшим алгоритмом  | | Сказать спасибо Ответить Цитировать |
| _ruzmaz_
Gold Member | # | Сообщение добавлено 11.04.2010 15:45:08 Отредактировано 12.04.2010 01:07:42 by _ruzmaz_ согласно условию задачи должно быть
for (int i = 3; i < n; i++)
Добавлено 12.04.2010 01:08:12 (через 1 минута 31 секунда )
код не совсем оптимален по быстродействию: n циклов, в каждом из которых как минимум одна операция деления - имхо не айс
Добавлено 12.04.2010 01:08:26 (через 14 секунд )
но если n не велико, то подобное решение в одну строчку кода может быть полезно)
Добавлено 12.04.2010 12:27:45 (через 11 часов 19 минут 19 секунд )
совсем упустил из вида что в том коде, который я раньше запостил, простая арифметическая прогрессия и циклы можно и не мутить))
def sumfunc(n, m)
return 0 if (n < 1) or (m <= 1) or (n >= m)
k = (m - 1)/n
return ((k + 1)*n*k)/2
end
print sumfunc(3, 1000) + sumfunc(5, 1000) - sumfunc(3*5, 1000), "\n"
| | Сказать спасибо Ответить Цитировать |
|
|