Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
drowzdnz
0 / 0 / 0
Регистрация: 04.08.2009
Сообщений: 8
#1

Практика - C++

04.08.2009, 22:50. Просмотров 1315. Ответов 15
Метки нет (Все метки)

Помогите с алгоритмом или как это решать ?

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

как я понял a = -1 или 1 или 0 ,не всегда же число P по этой формуле выйдет =\

2. Дано натуральные число п. Можно ли представить его в виде суммы трех квадратов натуральных чисел? Если можно, то:
а) указать тройку х, у, z таких натуральных чисел, что n=pow(x,2)+pow(y,2)y+pow(z,2).
6) указать все тройки х, у, z таких натуральных чисел, n=pow(x,2)+pow(y,2)y+pow(z,2)
.

тут как x , y , z изменять ? получаеться только с 0 до придела int ,а как прогонять туда обратно и каждое чесло по разному пример автомат игральный в казино ?

оригеналы в доке , из универа уходить не хочеться =\
Вложения
Тип файла: doc zadachi.doc (25.5 Кб, 32 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2009, 22:50     Практика
Посмотрите здесь:

Практика! - C++
Имеется таблица футбольного чемпионата, в котором участвовало n команд (см. задачу 413). Таблица представлена целочисленной...

практика - C++
какую книгу посоветуете по практике где идет разбор программ.

Практика - C++
Привет форумчане ! Есть ли желающие практиковать по с++ ? т.к на чтение книг нету времени ! Учеба в ПТУ на инфотихнолога.Практиковаться...

Практика на С++ - C++
Дело вот в чем. Я программист самоучка и учителя у меня не было. Прочитал несколько книг по C++, все понял, со всем разобрался. Но всё это...

Практика по с++ - C++
1)Дан массив целых чисел. Найти в этом массиве минимальный элемент m и максимальный элемент M. Получить в порядке возрастания все целые...

Практика С++ - C++
Привет, изучаю я тут С++ и понимаю, что практики недостаточно (а без практики - выйду после изучения нулем). Я прошел темы про...

Практика С++ - C++
Сегодня начали изучать C++. Пока только умею прятать кнопки, изменять текст и тд. Какие простенькие задачи можете посоветовать чтоб немного...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
04.08.2009, 23:51     Практика #2
( где а!=0 )
Ерунда какая-то - а где тут собственно a ?
Тут есть a[0], a[1], ..., a[n], но просто a нету.
Наверное имеется в виду a[n] != 0 ?
drowzdnz
0 / 0 / 0
Регистрация: 04.08.2009
Сообщений: 8
05.08.2009, 00:07  [ТС]     Практика #3
Я сам это не понял написано a!=0, наверно a[n] != 0 , не понять тупость =\
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
05.08.2009, 09:37     Практика #4
По поводу первой задачи.
Я тут подумал. Похоже задача разрешается и разрешается однозначно. То есть вариант разложения ровно один.
Это скорее математика, чем программирование.
Решать можно разными способами. Можно искать единственный вариант, а можно просто тупо перебрать все варианты

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].
Либо сразу вычисляем нужные значения.

Добавлено через 3 минуты 34 секунды
наверно a[n] != 0 , не понять тупость =\
Тут смайлики есть. Можно так сделать:
наверно a[n] != 0 ,
)))

Добавлено через 13 минут 50 секунд
тут как x , y , z изменять ?
В цикле например.
получаеться только с 0 до придела int
Не от 0, а от 1. В условии написано, что x,y,z - натуральные числа.
И не до предела int.
Например если у тебя n=10000, то очевидно, что нет смысла брать x>100 или y>100 или z>100.

Добавлено через 1 минуту 16 секунд
То есть имеем условие 1<=x,y,z<=sqrt(n).

Добавлено через 8 часов 48 минут 23 секунды
По поводу второй задачи.
Перебирать достаточно только x и y, z вычисляем: z=sqrt(n-x*x-y*y)
И смотрим - получилось целое число или нет.

В принципе можно еще наложить условие: x>=y>=z,
чтобы не перебирать лишние варианты. Все равно с точностью до перестановок x,y,z мы найдем все варианты.
drowzdnz
0 / 0 / 0
Регистрация: 04.08.2009
Сообщений: 8
05.08.2009, 14:06  [ТС]     Практика #5
А как перебирать x и y ? от 1 до sqrt(n) и обратно c sqrt(n) до 1 ?
надо что бы все значения прогоняла x и y , и выводила существует или нет .

Например n=29 , sqrt(n)=5 если округлить .

получаеться x = 3 , y=2 z=4 , 9+4+16=29. Вопрос x и y в этом случае прогоняется x c 1 до 3 , y c 1 до 2 , как прогонть ???

пример прогона x и y , при sqrt(n)=3

x y _ x y _ x y
1 1 | 2 1 | 1 3
2 2 | 1 2 | 2 2
3 3 | 3 3 | 3 1
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
05.08.2009, 22:27     Практика #6
А как перебирать x и y ? от 1 до sqrt(n) и обратно c sqrt(n) до 1 ?
Нафига обратно-то ?
пример прогона x и y , при sqrt(n)=3
Пример у тебя неправильный

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
 
 
int main( void ) {
 
int n,x,y,z;
int sn, z1, z2;
 
n= 29;
sn= (int)sqrt( n );
for ( x= 1; x<=sn; x++ ) {
    z1= n-x*x;
    for ( y= x; y<=sn; y++ ) {
        z2= z1-y*y;
        if ( z2<=0 ) { break; }
        z= (int)sqrt( z2 );
        if ( z<y ) { break; }
        if ( z*z != z2 ) { continue; }
        printf( "x=%d y=%d z=%d\n", x, y, z );
    }
}
 
return 0;
 
} /* main() */
Добавлено через 21 минуту 33 секунды
Ха!

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
 
 
void scan_3sqr( int n );
 
 
int main( void ) {
 
int n1, n2, n;
 
 
n1= 1;
n2= 10000;
for ( n= n1; n<=n2; n++ ) {
    printf( "n=%d\n", n );
    scan_3sqr( n );
    printf ( "================\n" );
}
return 0;
 
} /* main() */
 
 
void scan_3sqr( int n ) {
 
int x,y,z;
int sn, z1, z2;
int count= 0;
 
 
sn= (int)sqrt( n );
for ( x= 1; x<=sn; x++ ) {
    z1= n-x*x;
    for ( y= x; y<=sn; y++ ) {
        z2= z1-y*y;
        if ( z2<=0 ) { break; }
        z= (int)sqrt( z2 );
        if ( z<y ) { break; }
        if ( z*z != z2 ) { continue; }
        count++;
        printf( "x=%-3d y=%-3d z=%-3d\n", x, y, z );
    }
}
printf( "count=%d\n", count );
 
} /* scan_3sqr() */
drowzdnz
0 / 0 / 0
Регистрация: 04.08.2009
Сообщений: 8
05.08.2009, 23:23  [ТС]     Практика #7
Вот написал

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <math.h>
using namespace std;
 
 
int main(int argc, char *argv[])
{
   double x=0,y=1,j=0;
   double d,n,r=0,z=0,w=n;
   cout<<"Vvedite N"; cout<<"\n";
   cin>>n;
  
    d=floor(sqrt(n));
   cout<<"d="<<d;
   cout<<"\n";
   while(j<=((d*d)-1)) 
   {
               
   j++;             
   x++;
   
   if (x>d) {y++; x=1;}
   if (z>d){ z=1; }
   z=floor(sqrt(d+x*x+y*y));
   r=pow(x,2)+pow(y,2)+pow(z,2);
   cout<<"\n";
   cout<<"// "; cout<<" r= "<<r;  cout<<" x= " <<x; cout<<"  y= "<<y; cout<<"  z= "<<z; cout<<"\n"; 
 
//почему при выполнение этого условия программа считает не правельно ???? 
//if (r=n) {cout<<"// "; cout<<" r= "<<r;  cout<<" x= " <<x; cout<<"  y= "<<y; cout<<"  z= "<<z; cout<<"\n"; }
 
  cout<<"\n";
       }
             
    system("PAUSE");
    return EXIT_SUCCESS;
}


почему при выполнение этого условия программа считает не правельно ????
//if (r=n) {cout<<"// "; cout<<" r= "<<r; cout<<" x= " <<x; cout<<" y= "<<y; cout<<" z= "<<z; cout<<"\n"; }
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
05.08.2009, 23:30     Практика #8
Код
//if (r=n)
Ты допустил распространенную ламерскую ошибку. Правильно: if(r == n)
drowzdnz
0 / 0 / 0
Регистрация: 04.08.2009
Сообщений: 8
05.08.2009, 23:35  [ТС]     Практика #9
Этот код не правельный =\
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
06.08.2009, 18:11     Практика #10
Этот код не правельный
Какой именно ?
drowzdnz
0 / 0 / 0
Регистрация: 04.08.2009
Сообщений: 8
10.08.2009, 15:45  [ТС]     Практика #11
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].
Либо сразу вычисляем нужные значения.
Либо сразу вычисляем нужные значения.
Это как ? находим n получаем количество членов последовательности , но вот как определить , где -1, 0, 1 . И минимальное n это , что ? a[n] - это n ?
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
10.08.2009, 18:57     Практика #12
И минимальное n это , что ?
найти минимальный n, чтобы было верно: p<=(3**(n+1)-1)/2.

-1,0,+1 - это сильно напоминает троичную систему счисления, только там 0,1,2.

Добавлено через 13 минут 20 секунд
Имеем p.
Находим минимальный n, чтобы было верно: p<=(3**(n+1)-1)/2.
Нам нужно определить a[0],a[1],...,a[n].
Сдвигаем p.
p1= p+(3**(n+1)-1)/2
Далее нужно разложить число p1 в троичной системе счисления по цифрам.
b[0] - младший разряд, b[1] - следующий разряд, b[n] - старший разряд.
Пусть b[0],b[1],...,b[n] - это разложенное число p1, b[i]= 0 или 1 или 2.
Так как p1<=3**(n+1)-1, то нам не потребуется больше n+1 разряда.
Осталось сделать обратный сдвиг.
a[i]= b[i]-1;
В результате a[i]= -1 или 0 или 1.
drowzdnz
0 / 0 / 0
Регистрация: 04.08.2009
Сообщений: 8
10.08.2009, 18:58  [ТС]     Практика #13
Почему ни чего не получаеться по формулам .
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#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;
}
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
10.08.2009, 19:05     Практика #14
Например 64 в троичной системе счисления будет 2101
64==2*(3**3)+1*(3**2)+0*(3**1)+1*(3**0)

Добавлено через 4 минуты 56 секунд
Почему ни чего не получаеться по формулам
Потому что ерунду какую-то написал в строках 27-37
drowzdnz
0 / 0 / 0
Регистрация: 04.08.2009
Сообщений: 8
10.08.2009, 19:12  [ТС]     Практика #15
C++
1
2
3
4
5
6
7
8
9
10
11
while (n>= 0)
{ 
 n--;      
 for (int i = -1; i <= 1; i++)
 {
   a[n] = i;
   p += ( a[n] * pow(3,n) );
   
  }
    
}
Что тут не так ? Определили n , теперь подстановкой находим последовательность a[n]...a[0] , по этой формуле даже N не определяться .

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

cout<<"N= "<<n; cout << "\n";
N всегда выводиться 0 .


Та же фигня на паскале :

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function sign(ch:integer):integer;
begin
if(ch>0) sign:=1
else if(ch<0) then sign:=-1
else sign:=0;
end;
 
begin
n := trunc (log (2*abs(p)+1) mod 3)
while   (n>-1) do begin
if  (abs(p)<(exp(n*ln(3)))/2 then a[n] := 0 else a[n] := sign(p);
p := p - (exp(n*ln(3))*a[n];
n := n-1;
end;
 
end.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2009, 19:50     Практика
Еще ссылки по теме:

Практика ребята! - C++
1-&gt;С помощью функции произвести пересчёт расстояния из верст километры (1 верста-это 1066.8). 2-&gt; Определить колличество...

практика на экзамене - C++
вобщем я перездаю экзамен и мне дано задание:&quot;написать консольное приложение , которое позволяет пользователю ввести с клавиатуры 10-ть...

Нужна практика - C++
Приветствую всех. :) Не ругайтесь сильно, знаю что подобных тем было созданно уйма. Подскажите пожалуйста как мне поступить. Я ещё не учусь...

Нужна практика - C++
Дайте пожалуста 3 задачи по С++, а точнее по &quot;Перезагрузка операций&quot;. Учюсь вот по этой книжке &quot;Обьектно-Ориентированное Программирование...

Практика\структура - C++
Если не сложно напиши код именно по моему заданию: Ввести сведения о результатах экзаменационной сессии группы по следующей структур:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
10.08.2009, 19:50     Практика #16
Та же фигня
Вот поэтому и неправильно что фигня на выходе

Добавлено через 11 минут 31 секунду
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>
 
int main( int argc, char *argv[] ) {
 
int p, n;
int n31, half;
 
 
argc--; argv++;
if ( argc != 1 ) {
    fprintf( stderr, "Usage: prog p\n" );
    exit( 1 );
}
p= atoi( argv[0] );
if ( p<1 ) {
    fprintf( stderr, "must be: p>=1\n" );
    exit( 1 );
}
 
n31= 1;     /* n31 == 3**(n+1) */
for ( n= 0; ; n++ ) {
    n31*= 3;
    half= (n31-1)/2;
    if ( p<=half ) { break; }
}
 
printf( "p=%d n=%d n31=%d\n", p, n, n31 );
 
return 0;
 
} /* main() */
Добавлено через 21 минуту 16 секунд
Заодно выяснил, что до n==18 все нормально, а дальше нужно переходить на int64
Yandex
Объявления
10.08.2009, 19:50     Практика
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru