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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.65
v0l0d1ka
9 / 9 / 0
Регистрация: 14.12.2010
Сообщений: 129
#1

Возведение в степень - C++

09.10.2011, 01:28. Просмотров 5207. Ответов 30
Метки нет (Все метки)

Подскажите, как написать программу возведения 2-ки в миллионную степень и вывести результат на экран.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <math.h>
#include <cstdlib>
 
 
int main ()
{
  printf ("7 ^ 3 = %lf\n", pow (7.0,3.0));
  printf ("4.73 ^ 12 = %lf\n", pow (4.73,12.0));
  printf ("32.01 ^ 1.54 = %lf\n", pow (32.01,1.54));
  printf ("2 ^ 1000000.0 = %lf\n", pow (2.0,1000000.0));
  system("pause");
  return 0;
}
Не работает.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2011, 01:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возведение в степень (C++):

Возведение в степень - C++
Почему, когда я пытаюсь возвести в квадрат x с типом int, то получается 24, а когда с типом double, то все хорошо и получается 25? ...

Возведение в степень - C++
напишите программный код для С++ Builder

Возведение в степень - C++
Срочно, помогите записать выражение cos^4(x)

Возведение в степень - C++
Дано число n и его нужно возвести в степень s. Можно ли это как-то сделать не используя циклы. Заранее спасибо...

Возведение в степень - C++
Подскажите оператор для возведения числа в n-ую степень. Зарание спасиба

Возведение a в степень b - C++
Пользователь вводит числа а и b, программа считает &quot;а&quot; в степени &quot;b&quot;. Помогите написать код

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
09.10.2011, 13:53 #16
Цитата Сообщение от aeshes Посмотреть сообщение
А можно глянуть код хоть на яве, хоть на хаскеле - для вдохновения?
Код
[nameless@desktop haskell]$ cat sample.hs
import System.Environment (getArgs)

main = getArgs >>= print . (2^) . read . head
[nameless@desktop haskell]$ ghc --make sample.hs
[1 of 1] Compiling Main             ( sample.hs, sample.o )
Linking sample ...
[nameless@desktop haskell]$ time ./sample 1000000 > /dev/null

real	0m0.271s
user	0m0.267s
sys	0m0.001s
[nameless@desktop haskell]$
0
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
09.10.2011, 14:05 #17
Nameless One, я наверное, себя переоценила, потому что в хаскеле ничего не поняла ))
Но мне кажется строчка
main = getArgs >>= print . (2^) . read . head
берет аргументы из командной строки и возводит в степень средствами языка? типа запись 2^1000000?
А мне хотелось увидеть именно сам алгоритм быстрого возведения
Поправьте, если ошиблась, просто программу на хаскеле вижу первый раз
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.10.2011, 14:12 #18
Цитата Сообщение от aeshes Посмотреть сообщение
А мне хотелось увидеть именно сам алгоритм быстрого возведения
http://e-maxx.ru/algo/binary_pow
1
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
09.10.2011, 14:14 #19
Цитата Сообщение от aeshes Посмотреть сообщение
берет аргументы из командной строки и возводит в степень средствами языка? типа запись 2^1000000?
берет список аргументов из командной строки, берет первый элемент из списка, переводит его в число и возводит двойку в эту степень

Цитата Сообщение от aeshes Посмотреть сообщение
А мне хотелось увидеть именно сам алгоритм быстрого возведения
так их в гугле полным-полно
0
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
09.10.2011, 14:22 #20
Я знаю этот алгоритм, сама его писала тоже в качестве тренировки, безотносительно к большим числам) Просто хотела посмотреть на его реализацию применительно к большим числам в разных форматах хранения/представления. Так понимаю, что от реализации математических операций над большими числами (ну хотя бы умножения) в конкретном представлении все равно не уйти. А когда будет умножение, можно уже и возведение в степень реализовать
Просто было подозрение, что помимо быстрого возведения в степень можно как-то оптимизировать способ хранения большого числа именно для этой задачи, где 2 в основании

Nameless One, Спасибо. Примерно так и поняла. Т.е., используются средства языка для работы с большими числами
0
alkagolik
Заблокирован
09.10.2011, 14:28 #21
Цитата Сообщение от aeshes Посмотреть сообщение
Просто было подозрение, что помимо быстрого возведения в степень можно как-то оптимизировать способ хранения большого числа именно для этой задачи, где 2 в основании
я вижу только один способ, это массив чаров или с двуразрядными, или с одноразрядными числами (не решил пока) и переносы на триггерах (скорее D) и счетчиках, и операции преимущественно бинарные. картину "в общем" вижу. в ближайшее время сяду за реализацию.
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.10.2011, 14:34 #22
Цитата Сообщение от alkagolik Посмотреть сообщение
это массив чаров или с двуразрядными, или с одноразрядными числами
Можно спокойно по 9 цифр в одном элементе массива хранить.
Или по 17-18, если ассемблерные вставки использовать =\ Как - не знаю, не пробовал.
0
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
09.10.2011, 14:40 #23
Цитата Сообщение от alkagolik Посмотреть сообщение
я вижу только один способ, это массив чаров или...
Мне кажется, что массив чаров даст оптимизацию в используемой памяти для хранения. Но количество операций над массивом будет такое же, что и над массивом целых. Хотя могу и ошибаться
0
Thinker
Эксперт C++
4226 / 2200 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
09.10.2011, 14:41 #24
А зачем здесь вообще алгоритмы
http://www.cyberforum.ru/cgi-bin/latex.cgi?2^n = 10...0, где после 1 стоит n нулей
0
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
09.10.2011, 14:43 #25
Thinker, ну это да, я еще в самом начале написала, что это так. А если нужен десятичный вид, а не двоичный?

О, еще где-то видела реализацию больших чисел как массива unsigned long. Когда твое число превосходит максимально допустимое в данном типе, у тебя в след элемент массива записывается это переполнение, а пред элемент обнуляется
Короче, проблема, я так понимаю, в реализации мат операций над большим числом в конкретном представлении
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
09.10.2011, 14:43 #26
Thinker, ты с http://www.cyberforum.ru/cgi-bin/latex.cgi?10^n не путаешь, случаем?
0
Thinker
Эксперт C++
4226 / 2200 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
09.10.2011, 14:47 #27
Цитата Сообщение от Nameless One Посмотреть сообщение
Thinker, ты с http://www.cyberforum.ru/cgi-bin/latex.cgi?10^n не путаешь, случаем?
Неа, это двоичный формат!
0
Nameless One
09.10.2011, 14:57
  #28

Не по теме:

а, ну тогда все ок

0
demik991
0 / 0 / 0
Регистрация: 18.12.2011
Сообщений: 15
26.12.2011, 08:20 #29
вот мой псевдо двуядерний, 2 гига оперативки ( и пока ище криворукость в написании кода на С ) потребовал на раздумия 5 с половиной минут и таки вывел результат (думал не дождусь). При етих результатах уверен что можна оптимизировать и достичь куда лудших результатов.

Добавлено через 5 минут
Цитата Сообщение от alkagolik Посмотреть сообщение
вы представляете себе агрегат, который в состоянии вычислить
у меня такой имееться, канечно не напрямую, а так как я думал и так как здесь описывалось через масив

Добавлено через 59 минут
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
int p[35000],n,i,j,h,t;
 
for(int k = 0; k<35000; k++)
p[k]=0;
 
t=0;
h=0;
p[0]=1;
 
cout<< "Enter power of 2: ";
cin>>n;
 
if (n==0) p[0]=1;
else
{
   for(i=0; i<n; i++)
   for(j=0; j <= h; j++)
   {
 
       p[j]*=2;
       if (t>0) {p[j]+=t; t=0;}
       if(p[j]/1000000000>0)
       {
            t=p[j]/1000000000;
            p[j]=p[j]%1000000000;
            if(p[j+1]<=0)    h++;
        }
   }
}
вот мое детище, но зато как на меня тут просматриваеться алгоритм действий
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.12.2011, 15:27 #30
Цитата Сообщение от Nameless One Посмотреть сообщение
real* * 0m0.271s
Таки С быстрее.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
diagon@shadeware:~$ cat test.cpp
#include <stdio.h>
#include <gmp.h>
 
int main()
{
    FILE *out = fopen("output.txt", "w");
    
    mpz_t a;
    mpz_init(a);
    mpz_ui_pow_ui(a, 2, 1000000);
    mpz_out_str(out, 10, a);
}
diagon@shadeware:~$ gcc test.cpp -lgmp -O3 && time ./a.out
 
real    0m0.109s
user    0m0.104s
sys 0m0.000s
Т.е. за 0.1 секунду считает.
Причем почти все время уходит на вывод в файл, если вывод закомментить, то прога будет выполняться 0.001 секунду.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2011, 15:27
Привет! Вот еще темы с ответами:

Возведение в степень - C++
Совсем недавно начал изучать C++. Учу по книге. Было задание: Вводишь число Вводишь степень в которую надо возвести это число ...

Возведение в степень! - C++
Возник вопрос - Возможно пока не понятна в чем мысль! Попробую на примере объяснить! Возведение числа 2 в 1000 - ую степень будет...

возведение в степень! - C++
Кто помнит функцию возведения в степень.?? &quot;трам-пам-пам&quot; (a,b) ???? Добавлено через 3 минуты И еще желательно...

Возведение в степень. C++ - C++
можно ли написать программу для возведения в вводимую степень вводимого числа с помощью рекурсивной функции


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.12.2011, 15:27
Ответ Создать тему
Опции темы

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