Comments 104
UFO just landed and posted this here
UFO just landed and posted this here
n mod (n-1) ? Но это только для положительных.
0
n=1 ? :)
+1
abs(n) mod abs(n-1) и для отрицательных :)
0
UFO just landed and posted this here
Простите, а какая? Логическая?
0
UFO just landed and posted this here
a mod b = a - (a div b) * b
Корень же можно считать двояко. В смысле с одной стороны это просто сумма ряда до определенного места, и вот тут то проблема.
Каждое слагаемое ряда мы можем посчитать при помощи арифметической операции. (будет умножение, вычитание и деление), но вот можем ли мы сложить. Если считать что ряд мы считаем всегда до определенного члена, то тогда корень, как и любое другое возведение в степень есть операция арифметическая, ровно как и использование синуса, косинуса, прочей тригонометрии и вообще функций, получаемых при помощи арифметических операций из элементарных. (рекурсивненькое определение получилось)
Вот примерно так.
Корень же можно считать двояко. В смысле с одной стороны это просто сумма ряда до определенного места, и вот тут то проблема.
Каждое слагаемое ряда мы можем посчитать при помощи арифметической операции. (будет умножение, вычитание и деление), но вот можем ли мы сложить. Если считать что ряд мы считаем всегда до определенного члена, то тогда корень, как и любое другое возведение в степень есть операция арифметическая, ровно как и использование синуса, косинуса, прочей тригонометрии и вообще функций, получаемых при помощи арифметических операций из элементарных. (рекурсивненькое определение получилось)
Вот примерно так.
0
что за бред?
mod - это остаток от деления, этому классе во 2 учат
mod - это остаток от деления, этому классе во 2 учат
-1
if (1*n == 0) print "0"; else print "1";
-1
n := n*n; //на случай если отрицательное число и нельзя использовать модуль
answer := ((2*n+1)div(n+1)mod(n+1));
answer := ((2*n+1)div(n+1)mod(n+1));
+3
нужно значит проверить равно ли
Если n=0, то получаем что 2 делим на один, в итоге два.
Если n>0, то обозначим
Значит
Вуаля. Только единственная проблема, что при возведении n в квадрат будет переполнение, но я думаю подобную жесть с ограничениями в данном случае можно не рассматривать.
n*n + 1
ебенице. answer := 2 - (n*n + 2) div (n*n + 1)
Если n=0, то получаем что 2 делим на один, в итоге два.
2 - 2 = 0
.Если n>0, то обозначим
к = n*n + 1
и к+1/k < 2
. Значит
(n*n+2) div (n*n+1) = 1
, и 2 - 1 = 1
.Вуаля. Только единственная проблема, что при возведении n в квадрат будет переполнение, но я думаю подобную жесть с ограничениями в данном случае можно не рассматривать.
-1
n>0 в смысле n<>0. не поймите неправильно.
0
чему-чему равно n*n + 1?? :)
шутка. простите не сдержался...
шутка. простите не сдержался...
0
Однозначно равна ебенице =)
0
Кстати, нашел баг: если ввести допустим 123123, то ответ не равен единице...
0
Можно поподробнее? Почему он будет равен не единице?
1231232 + 1<1231232 + 2<(1231232 + 1)*2
значит 1231232+2 div 1231232+1 = 1
2-1 = 1;
Про проблемы переполнения я уже написал.
1231232 + 1<1231232 + 2<(1231232 + 1)*2
значит 1231232+2 div 1231232+1 = 1
2-1 = 1;
Про проблемы переполнения я уже написал.
0
для n >= 0: round(n / (n+1) + 0.5); в общем случае добавить abs()
-1
abs(n xor 0), у кого есть паскаль попробуте плз
-1
еще один вариант с использованием только модуля:
1-(abs(n+1)+abs(n-1)-2*abs(n))/2
1-(abs(n+1)+abs(n-1)-2*abs(n))/2
0
n=n*n
res=3*n div (2*n+1)
res=3*n div (2*n+1)
-1
((n-(n-1))+1)/2
-1
Всё проще: выводим Sin^2 (Pi*n/2)
-1
UFO just landed and posted this here
1-0^n
+5
гениально
-2
Пока не появляются отрицательные n :) Но это уже решается просто
0
Например 1-0^(n*n)
p.s. извиняюсь за количество ответов :)
p.s. извиняюсь за количество ответов :)
+3
да, так круче :)
я полчаса ничо не мог делать, голову ломал :)
я полчаса ничо не мог делать, голову ломал :)
+2
Это того стоило :)
Думаю 1-0^(n*n) это действительно самый правильный ответ (ибо он очень простой и всего 3 арифметические операции :)
Думаю 1-0^(n*n) это действительно самый правильный ответ (ибо он очень простой и всего 3 арифметические операции :)
0
потрясно!
0
используя только арифметические операции возвести в произвольную степень не получится
+2
writeln(x*x/(x*x+1):0:0);
+1
мож так? вроде и проще и быстрее..
abs(sgn(n))
abs(sgn(n))
-1
UFO just landed and posted this here
Я думаю, что в знаковых числах Ваша задача решения вообще не имеет, если не вводить ограничение на диапазон значений чисел.
Если же для промежуточной операции (для деления) можно использовать беззнаковое число, то есть как минимум 2 решения:
cardinal(n) / (cardinal(n / 2) + 1)
и:
1 - cardinal(n - 1) / cardinal(-1)
Без этого на максимально возможном диапазоне я думаю будет работать:
1 - ((n + 1) / ((n + 1) + n))
Если же для промежуточной операции (для деления) можно использовать беззнаковое число, то есть как минимум 2 решения:
cardinal(n) / (cardinal(n / 2) + 1)
и:
1 - cardinal(n - 1) / cardinal(-1)
Без этого на максимально возможном диапазоне я думаю будет работать:
1 - ((n + 1) / ((n + 1) + n))
0
n := n*n
1 - (1 div (n+1))
1 - (1 div (n+1))
-1
Арифметические операции - это только сложение, вычитание, умножение и деление
http://en.wikipedia.org/wiki/Arithmetic
Никаких div, abs, возведений в степень, сигнумов и прочих синусов :-)
http://en.wikipedia.org/wiki/Arithmetic
Никаких div, abs, возведений в степень, сигнумов и прочих синусов :-)
0
The traditional arithmetic operations are addition, subtraction, multiplication and division, although more advanced operations (such as manipulations of percentages, square root, exponentiation, and logarithmic functions) are also sometimes included in this subject.
так что пока четко не определено что включать в арифметические операции, правильное решение будет выделить тяжело. автор, просьба дать комментарии по этому поводу.
так что пока четко не определено что включать в арифметические операции, правильное решение будет выделить тяжело. автор, просьба дать комментарии по этому поводу.
0
Осмелюсь заметить что задача для поступления на курс "Первые шаги в программировании" весьма и весьма странная.
Если конечно цель не состоит в том чтобы составить у абитуриентов представление о программировании как о процессе решения бессмысленных головоломок.
Если конечно цель не состоит в том чтобы составить у абитуриентов представление о программировании как о процессе решения бессмысленных головоломок.
+3
UFO just landed and posted this here
long x = 1;
x = x * x;
while (x / 2 != 0) {
x = x /2;
}
System.out.println(x);
x = x * x;
while (x / 2 != 0) {
x = x /2;
}
System.out.println(x);
0
Лучше бы искали оптимальный вариант.
если / есть целочисленное деление без знака, то хороший вариант: (n
если / есть целочисленное деление без знака, то хороший вариант: (n
0
[хабра не хочет кушать <]Лучше бы искали оптимальный вариант.
если / есть целочисленное деление без знака, то хороший вариант: (n << 1) / (n++)
Примерное время выполнения:
/ - 35 тактов
<< - 2 такта
++ - 1 такт
Итог 38 тактов
Кто меньше? :)
если / есть целочисленное деление без знака, то хороший вариант: (n << 1) / (n++)
Примерное время выполнения:
/ - 35 тактов
<< - 2 такта
++ - 1 такт
Итог 38 тактов
Кто меньше? :)
0
Задача не имеет решений, если использовать только операции сложения и умножения (деление и вычитание - это то же самое).
Небольшое доказательство.
В конце любой функции, какой бы она сложной ни была, будет выполнено одно последнее арифметическое действие. Операндами этой последней операции будут 2 числа, которые как-то зависят от n. Неважно, как, будем считать, что это две функции f1(n) и f2(n), для простоты ф1 и ф2.
Если последнее действие умножение, то получаем, что ф1*ф2 = 0 при n=0, ф1*ф2 = 1 при n=1. Чтобы оба уравнения имели смысл, рассматриваем как систему, в итоге получается, что ф1=1/ф2. При этом, чтобы не было ошибки, ф2 не равно нулю, получаем, что ф1 тоже не равно нулю, ну тогда и последнее действие никогда не будет давать в результате ноль.
Если последнее действие сложение, то в итоге получаем систему ф1+ф2=0 и ф1+ф2=1. Получаем ф1=1/2, ф2=-1/2. В результате последняя операция вашей функции всегда будет давать 0.
Я вижу, что никто уже и так не мучается, но написал доказательство, чтоб уж точно никто не мучался :)
Небольшое доказательство.
В конце любой функции, какой бы она сложной ни была, будет выполнено одно последнее арифметическое действие. Операндами этой последней операции будут 2 числа, которые как-то зависят от n. Неважно, как, будем считать, что это две функции f1(n) и f2(n), для простоты ф1 и ф2.
Если последнее действие умножение, то получаем, что ф1*ф2 = 0 при n=0, ф1*ф2 = 1 при n=1. Чтобы оба уравнения имели смысл, рассматриваем как систему, в итоге получается, что ф1=1/ф2. При этом, чтобы не было ошибки, ф2 не равно нулю, получаем, что ф1 тоже не равно нулю, ну тогда и последнее действие никогда не будет давать в результате ноль.
Если последнее действие сложение, то в итоге получаем систему ф1+ф2=0 и ф1+ф2=1. Получаем ф1=1/2, ф2=-1/2. В результате последняя операция вашей функции всегда будет давать 0.
Я вижу, что никто уже и так не мучается, но написал доказательство, чтоб уж точно никто не мучался :)
+3
(n * n * 2) div (n * n + 1)
Учитывались арифметические операции div и умножение.
Вроде все.
Учитывались арифметические операции div и умножение.
Вроде все.
0
Дружище, будет ли опубликован правильный ответ?
0
write(n/n);
и все
и все
0
Эм... деление на ноль?
0
Так как мы используем паскаль, то директива {$I-} означает временное отключение контроля
0
На паскале лень проверять, но на Си сделал следующим образом:
int n = 12345; // введенное целое число
double e = 0.0000000000000001; // число, меньшее машинного эпсилон
double z = e/(e+n); // 1.0 либо число меньшее машинного эпсилон
int res = 1 + z - 1; // 1 если n=0, иначе 0
Правда в последней строчке неявно используется преобразование типов, но только для того чтобы из 1.0 или 0.0 сделать 1 или 0 соответственно.
Также результат возможно будет зависеть от оптимизатора.
Надеюсь никого не удивляет то, что хотя e != 0, выражение 1.0 + e == 1.0 возвращает true...
int n = 12345; // введенное целое число
double e = 0.0000000000000001; // число, меньшее машинного эпсилон
double z = e/(e+n); // 1.0 либо число меньшее машинного эпсилон
int res = 1 + z - 1; // 1 если n=0, иначе 0
Правда в последней строчке неявно используется преобразование типов, но только для того чтобы из 1.0 или 0.0 сделать 1 или 0 соответственно.
Также результат возможно будет зависеть от оптимизатора.
Надеюсь никого не удивляет то, что хотя e != 0, выражение 1.0 + e == 1.0 возвращает true...
0
Sign up to leave a comment.
Задачка для поступления на курс «Первые шаги в программировании»