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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2009, 15:37   #1
Drozvd
 
Регистрация: 09.04.2009
Сообщений: 4
По умолчанию Задание / Си

Задача: Дано натуральное число р. Получить последовательность а0, …, аn, каждый член ко-торой равен -1, 0 или 1, такую что р= а[n] * pow(3,n)+…+ а[1]*3+ а0

Решение:

n=0. Мы можем получить числа p: -1, 0, 1.
n=1. Можем получить p от -4 до 4.
n=2. Можем получить p от -13 до 13

Имеем произвольный n. Можем получить p от -(3**(n+1)-1)/2 до +(3**(n+1)-1)/2.
Различных вариантов ровно 3**(n+1).
Исходя из этой формулы если мы имеем натуральное p, но там нужно найти минимальный n, чтобы было верно: p<=(3**(n+1)-1)/2.
После того, как n определено дальше либо перебираем все a[n],...a[0].
Либо сразу вычисляем нужные значения.

Напишите плиз прогу , я не знаю как значение a[n] изменять в цикле на -1 , 0 , 1 должны проходить все значения как в счетчике или как прогонять , прога на С/C++ .
Drozvd вне форума Ответить с цитированием
Старый 10.08.2009, 16:36   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

стучите в асю 368161244, помогу
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 10.08.2009, 16:42   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Так подойдет?:
Код:
//---------------------------------------------------------------------------

#pragma hdrstop

#include <tchar.h>
#include <iostream.h>
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
 int p,a0=-1,an;
  for (int i = 0; i < 5; i++) {
   p+=((an=(an<1)?(an+1):-1)*pow(3,2));
  }
  cout<<p;
  getchar();
	return 0;
}
//---------------------------------------------------------------------------
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.08.2009, 17:06   #4
Drozvd
 
Регистрация: 09.04.2009
Сообщений: 4
По умолчанию

2 Stilet мне нужна последовательность a[n],...a[0] каждый член ко-торой равен -1, 0 или 1, такую что р= а[n] * pow(3,n)+…+ а[1]*3+ а0

Прогон a[n] :

for (int i = -1; i <= 1; i++) {
a[n] = i;

}
Drozvd вне форума Ответить с цитированием
Старый 10.08.2009, 17:22   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
мне нужна последовательность a[n],...a[0] каждый член ко-торой равен -1, 0 или 1
А я тебе что дал?
Код:
for (int i = 0; i < 5; i++) {
   p+=((an=(an<1)?(an+1):-1)*pow(3,2));
  }
Ты давай задачу в полной мере напиши, а не так чтоб догадывалась почтенная публика.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.08.2009, 17:44   #6
Drozvd
 
Регистрация: 09.04.2009
Сообщений: 4
По умолчанию

Это и есть задача ,оригинал в доке http://depositfiles.com/files/0nk6atmh2 .

А по этому решению какая то чушь получается :

Код:
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <math.h>


using namespace std;



int main(int argc, char *argv[])
{
  
    
    int j=0,m,d=0,i,n=0,p;
    int a[10000];   
  
    
cout << "vvedte P ";  cout << "\n";
cin>>p;
p=m;

 while (p<=d)
 {
     
         n++;
  d=(3*(n+1)-1)/2;
 }
 
cout<<"N= "<<n;   cout << "\n"; 

 while (n>= 0)
{ 
 n--;      
 for (int i = -1; i <= 1; i++)
 {
   a[n] = i;
   p += ( a[n] * pow(3,n) );
   
  
}
    
}
   cout << "\n";  
    system("PAUSE");
    return EXIT_SUCCESS;
}

Последний раз редактировалось Drozvd; 10.08.2009 в 17:48.
Drozvd вне форума Ответить с цитированием
Старый 11.08.2009, 06:33   #7
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Может, так?
Код:
#include <stdio.h>
#include <math.h>
#include <conio.h>
int p, n, a[10], sum;
void rec(int d, int si) {
   if(d == n + 1) return;
   a[d] = si;
   int f = (int)pow(3, (double)d) * si;
   sum += f;
   if(sum == p) {
      for(int i = 0; i <= d; i++) printf("%d ", a[i]);
      puts("");
   }
   rec(d + 1, -1);
   rec(d + 1, 0);
   rec(d + 1, 1);
   sum -= f;
}
int main() {
   scanf(" %d", &p);
   for(int i = 0;; i++) {
      n = i;
      if(p <= ((int)pow(3, (double)i + 1) - 1 / 2)) break;
   }
   rec(0, -1);
   rec(0, 0);
   rec(0, 1);
   _getch();
   return 0;
}
Сначала подбираем подходящее n линейным поиском(не бинарным, потому что функция (3**(n+1)-1)/2 растёт экспоненциально, и у нас нет большого количества разных значений параметра, таких, чтобы значения функции помещались в стандартные типы; можно было реализовать длинную арифметику, но это уже другая тема). Потом рекурсивным перебором находим подходящие значения элементов последовательности.
-----------------------------------------------------------------------------------------------------------------------------------
Кстати, хоть я и написал программу так, как будто может быть несколько способов получить p, такой способ, кажется, всегда один, или их нет.
-----------------------------------------------------------------------------------------------------------------------------------
Точно, такой способ один, если он есть, убираем puts(""); (или не убираем, разницы никакой)
-----------------------------------------------------------------------------------------------------------------------------------
Ошибка: в 23 строке надо писать < вместо <=.
-----------------------------------------------------------------------------------------------------------------------------------
Ещё одна ошибка: в строке 23 надо писать
Код:
if(p <= (((int)pow(3, (double)i + 1) - 1) / 2)) break;

Последний раз редактировалось megachuhancer; 11.08.2009 в 09:11.
megachuhancer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонятное задание. Dmitry81 Microsoft Office Excel 2 10.01.2009 12:38
Задание по матрицам Иван 883 Паскаль, Turbo Pascal, PascalABC.NET 2 27.12.2008 01:43
Задание ворд dr.Chas Microsoft Office Word 2 16.12.2008 00:51
Задание $ user570 Фриланс 3 15.06.2008 22:11