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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2012, 17:47   #1
7rubin
Пользователь
 
Регистрация: 18.12.2011
Сообщений: 25
Печаль Возведение числа в большую степень (например 3^100)

Программа для возведения числа в большую степень. Так как число очень большой длинны не помещается ни в один стандартный тип, то для его хранения использовать ДИНАМИЧЕСКИЙ массив.

Помогите пожалуйста.
(Х^K)
Я возведения в К-ую степень, я просто умножаю чилсо само на себя К раз. Но не могу понять как реализовать цикл для очередного перемножения полученного ранее числа на Х.(не знаю какую проверку использовать).
Да и когда я пытаюсь удалить созданный массив программа выдает ошибку((

Зараннее спасибо за любую помощь.



#include <stdio.h>
#include <conio.h>
#include <iostream>


void main()
{
setlocale(LC_ALL, "Russian_Russia.1251");
int pow;
int x;
int *arr;
arr = new int;
int i;
int j;
int flag;
int buffer;

printf("Введите основание!\n");
scanf("%d", &x);

printf("Введите степень!\n");
scanf("%d", &pow);

arr[1] = 1;


for (i = 1; i <= pow; i++)
{
flag = 0;

for(j = 1; (тут я не знаю какую проверку сделать); j++)
{
buffer = ((arr[j] * x) % 10) + flag;
flag = 0;
if ((arr[j] * x) / 10 > 0)
flag = (arr[j] * x) / 10;
arr[j] = buffer;
}

}


printf("%d^%d = ", x, pow);
for (i = последний индекс массива; i > 0; i--)
printf("%d", arr[i]);

//удаление массива(почему то не работает)
//if (arr)
//delete [] arr;


getch();

}
7rubin вне форума Ответить с цитированием
Старый 11.04.2012, 19:42   #2
7rubin
Пользователь
 
Регистрация: 18.12.2011
Сообщений: 25
По умолчанию

Алгоритм: сначало было допустим 3, потом 9, потом 7-2(в первой ячейке 7, во второй 2), далее 1-8, потом 3-4-2 и так далее. мы проверяем больше ли число 9 и если да, до оставляем в ячейке остаток от дления, а в arr[j + 1] прибавляем arr[j] / 10.

как я понимаю, если допустим получили число в 100 знаков, то при следующем умножении мы перемножаем все сто ячеек на наше основание.
но ведь длина числа всегда увеличивается!

for (i = 1; i <= pow; i++)
{
flag = 0;

for(j = 1; (тут я не знаю какую проверку сделать); j++)
{
buffer = ((arr[j] * x) % 10) + flag;
flag = 0;
if ((arr[j] * x) / 10 > 0)
flag = (arr[j] * x) / 10;
arr[j] = buffer;
}

в цикле for(j = 1; (тут я не знаю какую проверку сделать); j++) я должен перебрать все ячейки до длинны числа полученного ранее. но как эту длину находить я не понимаю.
7rubin вне форума Ответить с цитированием
Старый 11.04.2012, 19:49   #3
Asdprom
Форумчанин
 
Регистрация: 05.02.2011
Сообщений: 119
По умолчанию

может я и ошибаюсь ( скорее всего ) но может быть sizeof ();?

Последний раз редактировалось Asdprom; 11.04.2012 в 19:52.
Asdprom вне форума Ответить с цитированием
Старый 11.04.2012, 19:52   #4
7rubin
Пользователь
 
Регистрация: 18.12.2011
Сообщений: 25
По умолчанию

Да, но ф-я pow работает только со стандартными числами!
а мне нужно получать огромные числа(например 3^100 = 5.15 * 10 ^ 47)
такое число не в один стандартный тип не войдет)
да и по заданию у меня надо использовать именно ДИНАМИЧЕСКИЙ массив!

но всё равно спасибо за помощь
7rubin вне форума Ответить с цитированием
Старый 11.04.2012, 19:53   #5
Asdprom
Форумчанин
 
Регистрация: 05.02.2011
Сообщений: 119
По умолчанию

я отредактил сообщ. наверху.
Asdprom вне форума Ответить с цитированием
Старый 11.04.2012, 20:00   #6
7rubin
Пользователь
 
Регистрация: 18.12.2011
Сообщений: 25
По умолчанию

есть ф-я malloc для выделения памяти, но не могу понять как ей пользоваться!
например: int *p = (int*) maloc (sizeof(int) *n)
объясните плиз
7rubin вне форума Ответить с цитированием
Старый 11.04.2012, 20:03   #7
Asdprom
Форумчанин
 
Регистрация: 05.02.2011
Сообщений: 119
По умолчанию

а чего там в ней такого?
Вот пример для структуры:
Код:
struct addr {
  char name[40];
  char street[40];
  char city[40];
  char state[3];
  char zip[10];
};

struct addr *get_struct(void)
{
  struct addr *p;

  if((p = malloc(sizeof(struct addr)))==NULL) {
    printf("Ошибка при распределении памяти\n");
    exit(1);
  }
  return p;
}
Вот описание:

Функция malloc() возвращает указатель на первый байт области памяти размером size, которая была выделена из динамически распределяемой области памяти. Если для удовлетворения запроса в динамически распределяемой области памяти нет достаточного объема памяти, возвращается нулевой указатель. Перед попыткой использовать выделенную память всегда проверяйте, что возвращаемое значение не является нулевым указателем. Попытка использовать нулевой указатель обычно приводит к полному отказу системы.
Asdprom вне форума Ответить с цитированием
Старый 11.04.2012, 20:06   #8
Asdprom
Форумчанин
 
Регистрация: 05.02.2011
Сообщений: 119
По умолчанию

если хотите скину справочник по функциям языка C и C++
Asdprom вне форума Ответить с цитированием
Старый 11.04.2012, 20:07   #9
7rubin
Пользователь
 
Регистрация: 18.12.2011
Сообщений: 25
По умолчанию

было бы здорово)
7rubin вне форума Ответить с цитированием
Старый 11.04.2012, 20:09   #10
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Это возможно. Возвести число в сотую тепень?
Самое простое:

Цитата:
for(int i; i<100; i++)
{
X += X* k;
}
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возведение в степень числа в Delphi Gallaxy Помощь студентам 4 14.09.2010 22:04
Возведение числа в степень Gross Общие вопросы Delphi 8 25.12.2008 19:37
Возведение числа в степень Roberto Помощь студентам 9 05.04.2008 09:50