Дестер, да, ты прав, что-то я или не дописал, как хотел или перемудрил.. давно дело было)
Интеллигент боится лишь одного — касаться темы зла и его корней, потому что справедливо полагает, что здесь его могут сразу выeбaть телеграфным столбом.©
Неактивен
Вот решишь предложенную Майором задачу http://euler.jakumo.org/problems/view/340.html и тогда мы дружно признаем, что ты крутой авторитет
Что то компилер с ума спрыгивает . Тупой вопрос, 7^21 это скока? Просто у двух компиляторов си мнения капитально расходятся с виндовым калькулятором, а на глаз прав именно калькулятор
. Разница в младших разрядах, а как раз младшие то разряды хоть как нужны
.
Нет, так мы целей гнусных не достигнем... / В.П. Вишневский
Неактивен
Тупой вопрос, 7^21 это скока?
558545864083284007
Yesterday it worked.
Today it is not working.
Windows is like that.
Неактивен
558545864083284007
И виндовый кальк так же говорит. А Си почему то уверен что 558545864083284030, несмотря на long double
В результате у моего быдлокода нет шансов
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <math.h>
long double A,B,C,D;
long double F_n(long double n)
{
long double f=0;
//D=3*(A-C);
while (n<=B)
{
n=n+A;
f=f+D;
}
f=f+(n-C);
return f;
}
int main(void)
{
long double f,n=0,n1=0,s=0,s1=0;//A,B,C;
// A=pow(21,7);
// B=pow(7,21);
// C=pow(12,7);
A=50;
B=2000;
C=40;
D=3*(A-C);
//f=F_n(n);
// while (n<=B)
// {
// s=s+F_n(n);
// n++;
// }
while (n1<B)
{
n1=n1+A;
s1=s1+A*((F_n(n1)-A)+((A+1)/2));
}s1=s1+F_n(0);
//printf(" \n %Lf %Lf %Lf",A,B,C);
//printf(" \n %Lf %Lf %Lf",f,s,s1);
printf(" \n %Lf",s1);
getch();
return 0;
}
Хотя у него и так нет шансов, явно нужен другой подход
Нет, так мы целей гнусных не достигнем... / В.П. Вишневский
Неактивен
А Си почему то уверен что 558545864083284030, несмотря на long double
Майкрософтовский? Ну этот может, у них помнится на каком то калькуляторе значение синуса могло достигать восьми, даже в мирное время.
Yesterday it worked.
Today it is not working.
Windows is like that.
Неактивен
Я бы на твоём месте не позорился, а взял в руки бумагу и ручку и посчитал результат.
Да пожалуйста, хоть 7^221, на
5843416508321765137412223462176261055753559544095817424625430781485355014524409616639950700057743469282269362223748969437289370453147445512994056218802090543396973006957507863824356124007
Yesterday it worked.
Today it is not working.
Windows is like that.
Неактивен
Майкрософтовский? Ну этот может,
Этому верите?
http://www.wolframalpha.com/input/?i=7^21
Мне больше HP Slate понравился. Его в большой карман можно положить, а у Apple - сковородка какая-то бестолковая. © Руслан Карманов, twitter (-;
Неактивен
Майкрософтовский? Ну этот может, у них помнится на каком то калькуляторе значение синуса могло достигать восьми, даже в мирное время.
Калькуль то как раз выдает нормально. Просто для таких чисел встроеных в С типов данных маловато будет . У long double 15 знаков точности. Ну и учитывая что при степени B = 17 считается 30 секунд для 21 это около 3 дней
. Явно не то решение.
Нет, так мы целей гнусных не достигнем... / В.П. Вишневский
Неактивен
Этому верите?
Верю, оно с моим совпадает.
А 7^221 я на всякий случай проверил. Во
http://zalil.ru/31351408
Yesterday it worked.
Today it is not working.
Windows is like that.
Неактивен
Нужно ковырять 64-битную целочисленную арифметику, тогда - получится. Спецбиблиотеки юзать или самому что-то сочинять.
Это не решение. Время вычисления получится несколько дней, а нужно только несколько младших разрядов. Должна быть какая то бяка позволяющая это сделать проще
Нет, так мы целей гнусных не достигнем... / В.П. Вишневский
Неактивен
Кстати, получили результат за 20 итераций. Меньше вряд ли получится.
Ты #7 случаем не пропустил?
Yesterday it worked.
Today it is not working.
Windows is like that.
Неактивен
Пропустил.
Маладэц, а теперь посчитай сколько итераций там. Можешь воспользоваться калькулятором.
Yesterday it worked.
Today it is not working.
Windows is like that.
Неактивен
Блин. Погляди мой код хотя бы - где там несколько дней? Там 400 итераций на всё вычисление, причём можно уменьшить до 210.
Мы говорим о различных задачах. Я вобще то об этой http://euler.jakumo.org/problems/view/340.html
Нет, так мы целей гнусных не достигнем... / В.П. Вишневский
Неактивен
Ну, как вариант - 20 итераций чтобы выделить степени простых чисел, которые складываются в промежуточный массив, а потом ещё 9 итераций на умножение. Но тогда потребуется ещё один массив.
Не, видно не совсем внимательно читал.
Итак,
a=1
ищем первое простое равное 2.
ищем максимальную степень этого простого не превышающую 20, т.е 4
a=a*2^4
ищем второе простое, т.е 3.
ищем максимальную степень 3 не превышающую 20, нашли.
a=a*3^2
следующее простое - 5, 5^2>20 поэтому устанавливаем флаг отключающий возведение простого в степень и сравнение с 20
a=a*5
a=a*7
Итд.
Yesterday it worked.
Today it is not working.
Windows is like that.
Неактивен
Не понял второй записи:
F(n) = F(a + F(a + F(a + F(a + n))))
Как это будет вычисляться?
Для данных из примера a = 50, b = 2000 и c = 40
для n=2000
2000 = 2000 то есть 2 формула
F(a+n) => F(50+2000) 2050>2000 то есть F(2050) = n-c = 2050-40 =2010 =>
F(a+F(n)) => F(50 + 2010) = 2020
F(a+F(n)) => F(50 + 2020) = 2030
F(a+F(n)) => F(50 + 2040) = 2040
Как то так. Несколько сумбурно, но я нихрена не математик . С F(0) все еще тоскливее. 0+50 < 2000 => то есть возвращаемся на функцию и добавляем еще 50 . И так пока выражение в скобках не достигнет 2000. А потом все по цепочке назад. Куча вложений выходит. У меня значение функции для данных из задания и n=0 около 2 секунд считает
.
Добавлено спустя 56 мин 19 с:
Если бы B делилось на A - можно бы было прикинуть младшие разряды по такой формулке
s=F_n(B)+(B/A)*((3*(A-C))+(A/2));
А так... придется наверное выделять остаток и считать
Нет, так мы целей гнусных не достигнем... / В.П. Вишневский
Неактивен
Раскопаем труп тему, но это надо запостить!
Haskell:
main = do print $ foldl lcm 1 [1..20]
$ time ./hello.exe
232792560
real 0m0.069s
user 0m0.031s
sys 0m0.015s
Неактивен
Мдя. Туповатенькое решение. У меня оно за 30 секунд дошло только до одного миллиона.
Такое решение тратит много времени на пропечатку вариантов. Лучше уж так:
/*
compile with:
____________________
gcc -std=c99 -O3 -Wall -Werror ./file.c
*/
#include <stdio.h>
#include <stdbool.h>
int main( void )
{
int a = 0;
int b = 1;
int c = 20;
bool d = false;
int e = 0;
while(1)
{
a++;
e++;
if( e == 10000000 )
{
printf( "Passed %d...\n", a );
e = 0;
}
for( b = 1; b <= c; b++ )
{
if((a % b) != 0)
{
break;
}
else
{
if( b == c )
{
printf("Result: %d\n",a);
d = true;
}
}
}
if( d == true )
{
break;
}
}
return(0);
}
Тогда строка "Passed %d ..." будет выдаваться каждые 10 миллионов вариантов, что снизит нагрузку за счет вывода лишней инфы.
Добавлено спустя 02 мин 39 с:
Раскопаем труп тему, но это надо запостить!
Haskell:
main = do print $ foldl lcm 1 [1..20]
$ time ./hello.exe 232792560 real 0m0.069s user 0m0.031s sys 0m0.015s
А вы уверены что в эксешнике вообще есть алгоритм? Код мог быть соптимизирован компилятором и содержать только результат.
Редактировался fooser (02-06-12 14:25:43)
Неактивен