LINUX.ORG.RU
ФорумTalks

Задача и средства её решения


0

0

Есть функция определенная следующим образом f(0) = 0, f(1) = 1 f(2n) = f(n), f(2n+1)= f(n)+f(n+1) т.е. (я так понимаю): f(2) = f(2*1)=f(1) = 1, f(3) = f(2*1 + 1) = f(1) + f(1 + 1) = 2, f(4) = f(2*2) = f(2) = 1, f(5) = f(2*2 + 1) = f(2) + f(2 + 1) = 3, f(6) = f(2*3) = f(3) = 2, f(7) = f(2*4 + 1) = f(4) + f(4 + 1) = 4, f(8) = 1,

какой мат. программой можно посчитать f(M) где М - натуральное число.

Если писать программу, я так понимаю надо анализировать на четность М, и взависимости от этого вызывать указатель на функцию вычисления

anonymous

> какой мат. программой можно посчитать f(M) где М - натуральное число.

В моём стареньком калькуляторе можно, но извратно. В основном - из-за сильно ограниченной рекурсии.

> надо анализировать на четность М, и взависимости от этого вызывать указатель

Это на каком языке? На C? Pascal? Но даже там, я бы сделал без всяких указателей. 4 строки :)

K_X_XyHTA
()
Ответ на: комментарий от anonymous

Если я правильно понял - задание не посчитать а написать программу. А этой задачи алгоритм решения простой - собираешь в одном месте текстовый редактор, компютер, пальцы и мозги, включаешь все и пишешь.

DonkeyHot ★★★★★
()
Ответ на: комментарий от linux_newbe

ткните пжста в спецификацию

anonymous
()

int calc_it(int M)
{
if(M==1) return 1;
if(M==0) return 0;
if(M%2==1) return calc_it(M/2) + calc_it(M/2+1);
else return calc_it(M/2);
}

anonymous
()

#include <iostream>
int f(int i){return i/2?i%2?f(i/2)+f(i/2+1):f(i/2):i;}main(){int i;std::cin>>i;std::cout<<f(i)<<'\n';}

На C++ - две строчки. :)

mikhail
()
Ответ на: комментарий от mikhail

> int f(int i){return i/2?i%2?f(i/2)+f(i/2+1):f(i/2):i;}main(){int i;std::cin>>i;std::cout<<f(i)<<'\n';}

тьфу какая гадость, endl использовать леригия не позволяет?

anonymous
()
Ответ на: комментарий от mikhail

я конечно не спец, но нафига входить в рекурсию, если число чётное?

anonymous
()
Ответ на: комментарий от anonymous

>тьфу какая гадость, endl использовать леригия не позволяет?

Я использую, но очень хотелось, чтобы прога уместилась в 2 маленькие строчки. '\n' короче чем std::endl на 5 символов, а using namespace std; так вообще дофига места занимает. :)

mikhail
()
Ответ на: комментарий от anonymous

>молодец, ты все свои программы так записываешь?

Никакие. Просто присутствующие тут спорили, во сколько строчек программа. :)

mikhail
()
Ответ на: комментарий от atoku

Кстати конкретно для этой последовательности видел в какой-то книжке аналитическое решение в качестве примера, если не ошибаюсь.

Эх. Помню в детстве участвовал я в олимпиаде по программированию. Нужно было посчитать какую-то четырёхэтажную сумму сумм (i=0...N, j=0...i, k= j...N и так далее, что-то в этом духе). Я её превратил в многочлен (который ещё и на множители разложил), и программка моя состояла из одного-единственного бейсиковского оператора "PRINT этот многочлен" :)

Не засчитали, хотя результат верный показывала :) Результат просто не проверяли, ясно ж видно что фигня какая-то сдана а не решение, надо же четыре вложенных FOR :) Уроды.

Teak ★★★★★
()
Ответ на: комментарий от mikhail

Дык это ж вам не Латвия, а Усть-Майский район Якутской АССР :) О таком продвинутом подходе там даже не слыхали.

Я тут ещё не упомянул, что в качестве языка обязательно должен был использоваться Бейсик (ничего другого жюри просто не знало, очевидно), и благодаря отличию в его диалектах на моём компе ("Корвет") и у жюри мне срезали половину с ещё одной задачи :) В общем это анекдот был, а не олимпиада...

Teak ★★★★★
()
Ответ на: комментарий от anonymous

int event (int *);
int it (int );


int main (int argc, char **argv)
{
  int i;
  
  int m = 5;
  printf("%d", it(m));
  int temp = 0;
  for (i = 1; i <= it(m); ++i )
    {      
      if ((&m)%2 == 1) temp +=  event((&m)/2) + event((&m)/2 + 1);
      else temp += event((&m)/2);
      
    }
  
   printf("%d", temp); 

}


int event(int *m)
{
  if(*m==1) return 1;
  if(*m==0) return 0;
  else return *m;
}

int it (int M)
{
  int i;
  for (i = 1 ; ; i++)
    {
      M /= 2;
      if (M == 1) break;
    }
  return i;
}

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.