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

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

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

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

12.12.2013, 18:42. Просмотров 1092. Ответов 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. Скажите, где моя ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2013, 18:42     Возведение в степень (результат всегда = 0)
Посмотрите здесь:
Возведение a в степень b C++
Возведение в степень C++
C++ Возведение степень
Возведение в степень! C++
возведение в степень C++
C++ Возведение в степень
C++ Возведение в степень
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.12.2013, 18:47     Возведение в степень (результат всегда = 0) #2
Sh@dow777, функция pow принимает в качестве аргументов данные типа double
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,737
12.12.2013, 18:47     Возведение в степень (результат всегда = 0) #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
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
12.12.2013, 18:51     Возведение в степень (результат всегда = 0) #4
Цитата Сообщение от Sh@dow777 Посмотреть сообщение
scanf("%d%d", &a, &k);
тип у переменная a long double. а scanf() думает что int
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.12.2013, 19:02     Возведение в степень (результат всегда = 0) #5
Цитата Сообщение от _ Посмотреть сообщение
тип у переменная a long double. а scanf() думает что int
А еще printf ждет, что ему дадут int, а получает double
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,737
12.12.2013, 19:15     Возведение в степень (результат всегда = 0) #6
Цитата Сообщение от programina Посмотреть сообщение
А еще printf ждет, что ему дадут int, а получает double
ну тут то все в порядке, если можно так сказать, приведет к int да и все
дробь обрежет, при больших числах больше чем 231 врать будет, но при 23 отработает нормально
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.12.2013, 19:23     Возведение в степень (результат всегда = 0) #7
ValeryS, на gcc вот такой код не прокатит:
C++
#include <stdio.h>
#include <math.h>
 
int main()
{
        printf("%d\n", pow(2.0, 3.0));
}
Sh@dow777
12 / 12 / 3
Регистрация: 10.12.2013
Сообщений: 664
12.12.2013, 19:32  [ТС]     Возведение в степень (результат всегда = 0) #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;
}
Теперь вычисляет степень, но задача требует целочисленного результата. И чтобы так же вычисляло без ошибок при больших степенях. Помогите.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.12.2013, 20:15     Возведение в степень (результат всегда = 0) #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;
}
genaryok
22 / 22 / 4
Регистрация: 18.10.2013
Сообщений: 62
12.12.2013, 20:49     Возведение в степень (результат всегда = 0) #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;
}
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,737
12.12.2013, 21:57     Возведение в степень (результат всегда = 0) #11
genaryok,
а что это?
genaryok
22 / 22 / 4
Регистрация: 18.10.2013
Сообщений: 62
13.12.2013, 01:30     Возведение в степень (результат всегда = 0) #12
Цитата Сообщение от ValeryS Посмотреть сообщение
genaryok,
а что это?
Функция возведения числа в степень на основе его двоичного представления. Проверьте, если не верите.
Sh@dow777
12 / 12 / 3
Регистрация: 10.12.2013
Сообщений: 664
13.12.2013, 03:23  [ТС]     Возведение в степень (результат всегда = 0) #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. В чем теперь ошибка?
iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
13.12.2013, 03:29     Возведение в степень (результат всегда = 0) #14
Бесконечная рекурсия - функция pow возвращает результат функции pow и так бесконечно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2013, 10:08     Возведение в степень (результат всегда = 0)
Еще ссылки по теме:
Возведение в степень C++
возведение в степень C++
Возведение в степень C++
Возведение в степень C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,737
13.12.2013, 10:08     Возведение в степень (результат всегда = 0) #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
не все компиляторы деление на степень двойки переводят в сдвиг
Yandex
Объявления
13.12.2013, 10:08     Возведение в степень (результат всегда = 0)
Ответ Создать тему
Опции темы

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