Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++]Функции+указатели


Автор: Palladin 21.1.2007, 23:01
То же самой, помогите разобратся с этими указателями, вот задание:

Посчитать 2^500 и  1!+2!+…+100!

вот решение по обычному:

Код

int factorial();
int stepen();
int main()
{
cout<<"2 v 500 stepeni     = "<<stepen<<endl;
cout<<"Factorial 100 raven = "<<factorial<<endl;
getch();
return 0;
}
int factorial()
{
int i,fact;
fact=1;
for(i=1;i<=100;i++)
fact*=i;
return(fact);
}
int stepen()
{
int p;
p=pow(2,500);
return(p);
}


Хелп smile 

Автор: Romikgy 21.1.2007, 23:09
Цитата(RooR @  21.1.2007,  22:01 Найти цитируемый пост)
2^500


Цитата(RooR @  21.1.2007,  22:01 Найти цитируемый пост)
int stepen()
{
int p;
p=pow(2,500);
return(p);
}

в инт явно не влезет , может только в int64

Цитата(RooR @  21.1.2007,  22:01 Найти цитируемый пост)
1!+2!+…+100!


Цитата(RooR @  21.1.2007,  22:01 Найти цитируемый пост)
int factorial()
{
int i,fact;
fact=1;
for(i=1;i<=100;i++)
fact*=i;
return(fact);
}

неправильно

Автор: Palladin 21.1.2007, 23:13
Ну ланаsmile вот так может правильно, да и число влазит в int, запусти программуsmile))
вот изменил, с указателями подсаби плз smile 

Код

int factorial();
int stepen();
int main()
{
cout<<"2 v 500 stepeni     = "<<stepen<<endl;
cout<<"Factorial 100 raven = "<<factorial<<endl;
getch();
return 0;
}
int factorial()
{
int i;
long int fact;
fact=1;
for(i=1;i<=100;i++)
fact*=i;
return(fact);
}
int stepen()
{
long int p;
p=pow(2,500);
return(p);
}

Автор: Romikgy 21.1.2007, 23:26
у мя при факториале 22 
Код

#define llong unsigned long long
llong fact(llong x)
{
    llong t;
  //cout<<x<<endl;
  if (x==0 || x ==1) return 1;
  
  //return 
  t=x*(fact(x-1));
  cout<<x<<"\t"<<t<<endl;   
  return t;
}

шкалить разрядную сетку smile

Добавлено @ 23:33 
Цитата(RooR @  21.1.2007,  22:13 Найти цитируемый пост)
с указателями подсаби плз 

Код

char x[100]={0};
sprintf(x,"%p",stepen);
cout<<"2 v 500 stepeni     = "<<x<<endl;
sprintf(x,"%p",factorial);
cout<<"Factorial 100 raven = "<<x<<endl;

что то типа такого ты хотел?

Автор: Palladin 22.1.2007, 00:55
нет надо сделать передачу из функции в виде указателей ,както такsmile препод сам ниче незнает, поэтому задание дал а как хз

Автор: Romikgy 22.1.2007, 01:02
Цитата(RooR @  21.1.2007,  23:55 Найти цитируемый пост)
надо сделать передачу из функции в виде указателей

ты понял ? я нет , кого передать из ф_ции в виде указателей?

Автор: Pete 22.1.2007, 01:09
Цитата(Romikgy @  22.1.2007,  00:09 Найти цитируемый пост)
в инт явно не влезет , может только в int64

 smile 
Никуда не влезет! Ни в один элементарный тип!!

Цитата(RooR @  22.1.2007,  01:55 Найти цитируемый пост)
нет надо сделать передачу из функции в виде указателей ,както такsmile препод сам ниче незнает, поэтому задание дал а как хз

Это потому, что надо реализовывать длинную арифметику.  smile 

Цитата(Romikgy @  22.1.2007,  00:26 Найти цитируемый пост)
#define llong unsigned long long

По секрету, есть typedef...  smile 

Для сравнения с int64 и т.п.:

100! = 933262154439441526816992388562667004907159682643816
214685929638952175999932299156089414639761565182862536979
20827223758251185210916864000000000000000000000000

2^500 = 32733906078961418700131896968275991522166420460430
647894832913680961337964046745548832700923259041571508866
84127560071009217256545885393053328527589376

Автор: Romikgy 22.1.2007, 01:13
Цитата(Pete @  22.1.2007,  00:09 Найти цитируемый пост)
По секрету, есть typedef... 

в курсе

Автор: Palladin 22.1.2007, 01:18
гы, ну челы я незнаю конечно, может и так, но у мя почемуто намашине разницы нет int или long int всеровно выводит 9-и значное число и все, но не в этом дело, короче задача мол сделать через функции эти задачи, но сделать несколько иначе, короче вот return возвращает из двух функции значения, вот это надо сделать через указатели, короче посчитать, потом передать адрес и в мейне уже взять число, конечно если это возможно, анм препод дал такое задание, а препод сам оч "много" знает

Автор: Pete 22.1.2007, 01:29
Цитата(RooR @  22.1.2007,  02:18 Найти цитируемый пост)
разницы нет int или long int

Все зависит от системы. Гарантируется только, что sizeof(int) <= sizeof(long int) <= sizeof(long long int).

Цитата(RooR @  22.1.2007,  02:18 Найти цитируемый пост)
это надо сделать через указатели

По крайней мере, в данном вопросе твой препод дал вполне разумный совет, а разобраться до конца логично поручил тебе.
Так как для таких больших чисел нет встроенного типа, придется реализовывать его самому. Самый простой вариант -- хранить в массиве char'ов цифры данного числа. Самому придется писать функцию (или перегруженный оператор) длинного умножения. Эта проблема обсуждалась несколько раз на форуме, в частности есть очень неплохой исходник из книги для подготовки к олимпиадам по программированию.

Автор: Palladin 22.1.2007, 01:34
Нет Пётр, может такое и можно задать, но он точно не могsmile)) поверь мне, короче говоря что в этой программе можно сделать через указатели??? особо не увеличивая код???? и с коментами плз

допустим вот код сделал Ромикьюsmile 

Код

char x[100]={0};
sprintf(x,"%p",stepen);
cout<<"2 v 500 stepeni     = "<<x<<endl;
sprintf(x,"%p",factorial);
cout<<"Factorial 100 raven = "<<x<<endl;


что он делает

Добавлено @ 01:36 
Я так понял эт адреса выдала программа smile мне числа надоsmile

Добавлено @ 01:40 
Короч сорри за оффтоп, вот я так передалал, вроде числа прога показывает, правильно так

Я короч подумал что твой вариант адреса дает, ну и я сделал чтоб показывала прога значения по этим адресам, объясни че за функция sprintf

Добавлено @ 01:41 
Код

char x[100]={0};
sprintf(x,"%p",stepen);
cout<<"2 v 500 stepeni     = "<<&x<<endl;
sprintf(x,"%p",factorial);
cout<<"Factorial 100 raven = "<<&x<<endl;

Автор: Pete 22.1.2007, 01:44
Цитата(RooR @  22.1.2007,  02:34 Найти цитируемый пост)
объясни че за функция sprintf

Она здесь вообще не нужна, не парься. Просто он в конце адрес печатает.

Добавлено @ 01:49 
Если ты так уверен в простоте задания, то...
Цитата(RooR @  22.1.2007,  02:34 Найти цитируемый пост)
что в этой программе можно сделать через указатели??? особо не увеличивая код????

Ничего. Не увеличивая, НЕЛЬЗЯ. Правда, я совсем не знаю STL полюса, может, там что-то есть, хотя вряд ли. Иначе не писали бы gmp для с++.
Последнее, что приходит мне в голову: он мог давать эту часть (реализацию длинной арифметики) в течение семестра. Ну, еще бывают преподы, которых можно сильно разозлить...   smile 

Автор: Palladin 22.1.2007, 01:53
Нет я думаю что ты прав, что именно с арифметикой, но дело в том, что это обычная лаба, на которую отводится полтара часа, мол закрепление знаний о функциях, задания взяты с Минского универа, поэтому-то она такая сложная

Автор: Pete 22.1.2007, 01:57
Тебе лучше знать, что за задание и кто виноват.. Кроме как через длинную арифметику, я не знаю, как решить такую задачу на сях.  smile 

Автор: Palladin 22.1.2007, 02:02
А насколько сложна такая задача если её делать через арифметику, я то точно сам не сделаю, просто если не сложно сделай плз с коментами, все одно знать больше будуsmile smile 

Автор: Pete 22.1.2007, 02:26
Посмотри http://forum.vingrad.ru/topic-125077.html тему. Вопрос уже поднимался.

Автор: Romikgy 22.1.2007, 10:24
Код

#include <cstdlib>
#include <iostream>
#include "bigint.h"

using namespace std;


            

RossiBigInt factbi(RossiBigInt x)
{
    RossiBigInt t;
  
  if (x==RossiBigInt(0) || x ==RossiBigInt(1)) return RossiBigInt(1);
  
  
  t=x*(factbi(x-RossiBigInt(1)));
  return t;
}

RossiBigInt fact(int x)
{
   return factbi(RossiBigInt(x));         
}

RossiBigInt pow(int x, int y)
{
  RossiBigInt z(x),t=z;
   for (int i=1;i<y;i++)
   z=z*t;
  return z;           
}

int main(int argc, char *argv[])
{

    cout<<"2 v 500 stepeni     = "<<pow(2,500)<<endl;
    cout<<"Factorial 100 raven = "<<fact(100)<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}


Ответ
Цитата

2 v 500 stepeni     = 3273390607896141870013189696827599152216642046043064789483
29136809613379640467455488327009232590415715088668412756007100921725654588539305
3328527589376
Factorial 100 raven = 9332621544394415268169923885626670049071596826438162146859
29638952175999932299156089414639761565182862536979208272237582511852109168640000
00000000000000000000
Для продолжения нажмите любую клавишу . . .

компилировал в gcc,
в прикрепл. файле класс для работы с большими числами

Автор: Palladin 23.1.2007, 01:23
фигассе, сенкс за труд, но как я и говорил препод об это даже и не думал, я здал то что было на 10 балловsmile)

Автор: Romikgy 23.1.2007, 09:45
Цитата(RooR @  23.1.2007,  00:23 Найти цитируемый пост)
на 10 баллов

ниче мне это не говорит , это сколько ?

Автор: Palladin 23.1.2007, 16:46
это по 5 бальной системе 5:))) или как у мя по 10-и бально 10, т.е. самый высокий балsmile) ну там правда ещё теоретические вопросы были, и на защиту надо было программу подобную сделать...

Автор: Romikgy 23.1.2007, 16:56
ну тогда мои поздравления со здачей

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)