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

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

Войти
Регистрация
Восстановить пароль
 
 
Sh@dow777
12 / 12 / 3
Регистрация: 10.12.2013
Сообщений: 679
#1

Возведение в степень (результат всегда = 0) - C++

12.12.2013, 18:42. Просмотров 1180. Ответов 21
Метки нет (Все метки)

Привет всем. Люди, помогите с задачей. Я новичок, учусь в универе. Понимаю, что задача элементарная, но не могу понять одного. Нужно возвести число a в степень k.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
double long a;
int T, count, k;
 
int main()
{
    scanf("%d", &T);
 
    for(count = 1; count <= T; count++){
        scanf("%d%d", &a, &k);
        printf("%d\n", pow(a,k));
    }
 
    getch();
 
    return 0;
}
T - тестовые случаи. Без них не примут решение. При каждом возведении в степень выдает 0. Скажите, где моя ошибка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2013, 18:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возведение в степень (результат всегда = 0) (C++):

Возведение степень - C++
int n=2; float i; i=pow(((n-1)/(n+1)), n*(n-1)); Выдает ошибку Domain Error. В чем дело и есть ли альтернатива pow() ?

Возведение в степень - C++
Подскажите, как написать программу возведения 2-ки в миллионную степень и вывести результат на экран. #include &lt;stdio.h&gt; #include...

возведение в степень - C++
Всем привет кто обитает на сеем форуме)) учу с++ столкнулся с проблемой, не могу написать программу которая возводит введённое с...

Возведение в степень - C++
Здравствуйте! Есть какой то другой способ возведения в степень чем а^3 = а*а*а А если нужно в 100 степень возводить то умереть и не...

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

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

21
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.12.2013, 18:47 #2
Sh@dow777, функция pow принимает в качестве аргументов данные типа double
1
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,233
12.12.2013, 18:47 #3
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
double long a;
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
scanf("%d%d", &a, &k);
не получится
тебе нужно
C
1
scanf("%Lf%d", &a, &k);
почитай что нибудь про scanf и его спецификаторы, хотя бы вот это
http://lord-n.narod.ru/download/book...C/13/scanf.htm
0
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
12.12.2013, 18:51 #4
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
scanf("%d%d", &a, &k);
тип у переменная a long double. а scanf() думает что int
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.12.2013, 19:02 #5
Цитата Сообщение от _ Посмотреть сообщение
тип у переменная a long double. а scanf() думает что int
А еще printf ждет, что ему дадут int, а получает double
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,233
12.12.2013, 19:15 #6
Цитата Сообщение от programina Посмотреть сообщение
А еще printf ждет, что ему дадут int, а получает double
ну тут то все в порядке, если можно так сказать, приведет к int да и все
дробь обрежет, при больших числах больше чем 231 врать будет, но при 23 отработает нормально
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.12.2013, 19:23 #7
ValeryS, на gcc вот такой код не прокатит:
C++
#include <stdio.h>
#include <math.h>
 
int main()
{
        printf("%d\n", pow(2.0, 3.0));
}
0
Sh@dow777
12 / 12 / 3
Регистрация: 10.12.2013
Сообщений: 679
12.12.2013, 19:32  [ТС] #8
Написал так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <math.h>
 
double long a, k;
int T, count;
 
int main()
{
    scanf("%d", &T);
 
    for(count = 1; count <= T; count++){
        scanf("%Lf%Lf", &a, &k);
        printf("%Lf\n", pow(a,k));
    }
 
    return 0;
}
Теперь вычисляет степень, но задача требует целочисленного результата. И чтобы так же вычисляло без ошибок при больших степенях. Помогите.
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.12.2013, 20:15 #9
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
Теперь вычисляет степень, но задача требует целочисленного результата. И чтобы так же вычисляло без ошибок при больших степенях. Помогите
C++
#include <stdio.h>
 
long int mul(long int n, int m)
{
    long int l = 1;
    for(int i = 0; i < m; i++)
        l *= n;
 
    return l;
}
 
long int a;
int k;
 
int main()
{
    scanf("%ld", &a);
    scanf("%d", &k);
 
    long int x = mul(a, k);
 
    printf("%ld\n", x);
 
    return 0;
}
0
genaryok
22 / 22 / 4
Регистрация: 18.10.2013
Сообщений: 62
12.12.2013, 20:49 #10
Я бы так делал
C++
1
2
3
4
5
6
7
8
9
10
int Step(int x,int n)  
{int r=1;
  while  (n != 0)
 {
    if (n % 2 == 1) r=r*x;
    x=x*x;
    n=n / 2;
 }
  return r;
}
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,233
12.12.2013, 21:57 #11
genaryok,
а что это?
0
genaryok
22 / 22 / 4
Регистрация: 18.10.2013
Сообщений: 62
13.12.2013, 01:30 #12
Цитата Сообщение от ValeryS Посмотреть сообщение
genaryok,
а что это?
Функция возведения числа в степень на основе его двоичного представления. Проверьте, если не верите.
0
Sh@dow777
12 / 12 / 3
Регистрация: 10.12.2013
Сообщений: 679
13.12.2013, 03:23  [ТС] #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
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
long int pow(long int a, long int k);
 
int main()
{
    int T,i;
    long int a, k;
 
    scanf("%d", &T);
 
    for(i = 1;i <= T;i++){
        scanf("%ld%ld", &a, &k);
        printf("%ld", pow(a,k));
    }
 
    getch();
 
    return 0;
}
 
long int pow(long int a, long int k){
    return pow(a,k);
}
Теперь выдает ошибку Stack overflow. В чем теперь ошибка?
0
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
13.12.2013, 03:29 #14
Бесконечная рекурсия - функция pow возвращает результат функции pow и так бесконечно
0
ValeryS
Модератор
6729 / 5138 / 484
Регистрация: 14.02.2011
Сообщений: 17,233
13.12.2013, 10:08 #15
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
long int pow(long int a, long int k){
* * return pow(a,k);
}
попробуй словами описать что делает эта функция
Цитата Сообщение от genaryok Посмотреть сообщение
Функция возведения числа в степень на основе его двоичного представления.
а что числа в компьютере лежат не в двоичном формате?
Цитата Сообщение от genaryok Посмотреть сообщение
Проверьте, если не верите.
проверяем
32
простой способ
3*3 одно действие 6-12 тактов процессора
твой алгоритм
Цитата Сообщение от genaryok Посмотреть сообщение
while *(n != 0)
3!=0 истина ветвление
Цитата Сообщение от genaryok Посмотреть сообщение
if (n % 2 == 1)
3%2=1 деление с остатком 40 тактов ( здесь правда это будет 3&1 один такт) плюс ветвление
Цитата Сообщение от genaryok Посмотреть сообщение
r=r*x;
1*3 r=3умножение 6-12 тактов процессора
Цитата Сообщение от genaryok Посмотреть сообщение
x=x*x;
3*3 x=9 умножение 6-12 тактов процессора
Цитата Сообщение от genaryok Посмотреть сообщение
n=n / 2;
3/2=1 n=1 деление около 40 тактов( здесь правда будет сдвиг 1 такт)
Цитата Сообщение от genaryok Посмотреть сообщение
while *(n != 0)
1!=0 истина ветвление
Цитата Сообщение от genaryok Посмотреть сообщение
if (n % 2 == 1)
1%2=1 деление с остатком 40 тактов ( здесь правда это будет 1&1 один такт) плюс ветвление
Цитата Сообщение от genaryok Посмотреть сообщение
r=r*x;
3*9 r= 27 умножение 6-12 тактов процессора
Цитата Сообщение от genaryok Посмотреть сообщение
x=x*x;
9*9 x=81 умножение 6-12 тактов процессора
Цитата Сообщение от genaryok Посмотреть сообщение
n=n / 2;
1/2=0 деление около 40 тактов( здесь правда будет сдвиг 1 такт)
Цитата Сообщение от genaryok Посмотреть сообщение
while *(n != 0)
0!=0 ложь -выход ветвление

итого гораздо медленней
плюс неправильный результат
может на больших числах и будет выигрыш, если подправишь свой алгоритм
и заменишь n=n / 2; на сдвиг вправо
а n % 2 на n&0x01
не все компиляторы деление на степень двойки переводят в сдвиг
2
13.12.2013, 10:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2013, 10:08
Привет! Вот еще темы с ответами:

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

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

возведение в степень - C++
помогите плиз! в файле есть задачка. нужно рекурсивно возвести в степень. Код: #include &lt;iostream&gt; float stepen(float a, int n) { ...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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