Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Larionova_Darya
0 / 0 / 0
Регистрация: 28.12.2016
Сообщений: 18
Завершенные тесты: 1
1

Возведение в степень чисел в восьмеричной системе счисления

28.12.2016, 21:01. Просмотров 1172. Ответов 27
Метки нет (Все метки)

Помогите, пожалуйста, написать программу.
Вводятся два числа в восьмеричной системе счисления, производится проверка на точность ввода(т.е. отсутствие в числах 8,9), первое число возводится в степень равную второму числу, вывод на экран.
(значение хранится в символьном массиве - строке).
Вся арифметика происходит в восьмеричной СС.

!!!функцию pow(n,k) использовать нельзя!!!

Заранее благодарю за ответы
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2016, 21:01
Ответы с готовыми решениями:

Вычитание 2-х чисел в восьмеричной системе счисления
Помогите, пожалуйста, написать программу на С(С++): а)Вычитание 2-х чисел в...

Поменять порядок цифр натурального числа N, представленного в восьмеричной системе счисления, на обратный
Всем доброго дня ! Это моя первая циклическая задача подскажите где ошибки?? ...

Считая, что оно введено в восьмеричной системе счисления, найти его десятеричное представление
Задано число диапазона unsigned long. Считая, что оно введено в восьмеричной...

Простые Классы (сложение чисел в восьмеричной системе)
Разработать класс, содержащий два члена (назовем их first, second), и следующие...

Перевод чисел из восьмеричной системы счисления в десятичную
Есть код программы, которая переводит числа из двоичной системы счисления в...

27
Fixer_84
1049 / 659 / 651
Регистрация: 30.04.2016
Сообщений: 2,234
28.12.2016, 22:12 2
Larionova_Darya, здравствуйте! Я попытался вам помочь так:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <cmath>
 
using namespace std;
 
bool IfOct(string s)
{
    for (int i = 0; s[i]; i++)
    {
        if ((s[i] == '8') || (s[i] == '9'))
        {
            return true;
            break;
        }
    }
}
 
int NumToPow(int A, int N)
{
    if (N == 0)
    {
        return 1;
    }
    else if (N > 0)
    {
        return exp(N * log(A));
    }
}
 
int main()
{
    int A, N;
    do
    {
        cout << "Введите число:" << endl;
        cout << "A = ";
        cin >> A;
        if (IfOct(to_string(A)))
            cout << "Число должно быть восьмеричным!" << endl;
    } while (IfOct(to_string(A)));
    cout << "Введите степень:" << endl;
    cout << "N = ";
    cin >> N;
    cout << "Число возведенное в степень: " << NumToPow(A, N) << endl;
    system("pause");
    return 0;
}
1
Larionova_Darya
0 / 0 / 0
Регистрация: 28.12.2016
Сообщений: 18
Завершенные тесты: 1
28.12.2016, 22:44  [ТС] 3
Fixer_84, Спасибо))

а можете объяснить поподробнее вот это?
Цитата Сообщение от Fixer_84 Посмотреть сообщение
return exp(N * log(A));
↓ вот тут, мне кажется, должно быть НЕ РАВНО
Цитата Сообщение от Fixer_84 Посмотреть сообщение
if ((s[i] == '8') || (s[i] == '9'))
и еще компилятор выдает, что to_string не определен
0
Fixer_84
1049 / 659 / 651
Регистрация: 30.04.2016
Сообщений: 2,234
28.12.2016, 22:51 4
Larionova_Darya, Первое - это экспонента и десятичный алгоритм. Так в математике можно получить степень. Можно также использовать рекурсию. Насчет функции - она возвращает true если число не восьмеричное (можно сделать наоборот). Функция to_string() - это проблема многих компиляторов, так как нужно указывать стандарт. Я могу переделать без to_string() или вы справитесь без меня? Можно вообще исключить использование строк из этой программы. Просто отпишитесь, что вам нужно.
0
Larionova_Darya
0 / 0 / 0
Регистрация: 28.12.2016
Сообщений: 18
Завершенные тесты: 1
28.12.2016, 23:07  [ТС] 5
Fixer_84, с to_string разобралась)

а вот проверка на восьмеричность при вводе любого числа возвращает true..

Может быть можно с вами как-то связаться за пределами форума для более удобного обсуждения, например, какая-нибудь соц.сеть?
0
Fixer_84
1049 / 659 / 651
Регистрация: 30.04.2016
Сообщений: 2,234
28.12.2016, 23:11 6
Larionova_Darya, так как уже довольно поздно и я ложусь спать, отправляю вам программу без использования строк, что считаю более логичным. Если нужно что-то еще исправить - пишите. Компилятор на этот раз ругаться не должен.

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <cmath>
 
using namespace std;
 
bool IfNotOct(int A)
{
    while (A > 0)
    {
        if ((A % 10 == 8) || (A % 10 == 9))
        {
            return true;
            break;
        }
        A /= 10;
    }
}
 
int NumToPow(int A, int N)
{
    if (N == 0)
    {
        return 1;
    }
    else if (N > 0)
    {
        return exp(N * log(A));
    }
}
 
int main()
{
    int A, N;
    do
    {
        cout << "Введите число:" << endl;
        cout << "A = ";
        cin >> A;
        if (IfNotOct(A))
            cout << "Число должно быть восьмеричным!" << endl;
    } while (IfNotOct(A));
    cout << "Введите степень:" << endl;
    cout << "N = ";
    cin >> N;
    cout << "Число возведенное в степень: " << NumToPow(A, N) << endl;
    system("pause");
    return 0;
}
Добавлено через 2 минуты
Larionova_Darya, P.S. Я назвал функцию IfNotOct, чтобы все было логично.
0
likehood
965 / 814 / 390
Регистрация: 25.12.2016
Сообщений: 2,691
Завершенные тесты: 3
28.12.2016, 23:12 7
Цитата Сообщение от Fixer_84 Посмотреть сообщение
десятичный алгоритм
видимо всё же логарифм (к тому же натуральный)
Впрочем, если запрещено использовать функцию pow, то не факт, что разрешено использовать её имитацию.
0
Fixer_84
1049 / 659 / 651
Регистрация: 30.04.2016
Сообщений: 2,234
28.12.2016, 23:22 8
Larionova_Darya, если вам не подходит экспонента, можно использовать рекурсивную функцию:

C++
1
2
3
4
5
int NumToPow(int A, int N)
{
if (!(N)) return 1;
else if (N > 0) return A * Power(A, N - 1);
}
Добавлено через 2 минуты
likehood, спасибо за ваше замечание. Да, это опечатка, а логарифм - правда натуральный.
0
Larionova_Darya
0 / 0 / 0
Регистрация: 28.12.2016
Сообщений: 18
Завершенные тесты: 1
28.12.2016, 23:23  [ТС] 9
likehood, вообще преподаватель сказала реализовать как-то так
C++
1
2
3
4
5
6
while k>0
{
   result*=n;
   k--;
 
}
где k-степень, n-основание
0
Fixer_84
1049 / 659 / 651
Регистрация: 30.04.2016
Сообщений: 2,234
28.12.2016, 23:25 10
Larionova_Darya, наверное, это потому что я не указал
C++
1
return false;
в конце функции. Добавьте
C++
1
return false;
после 16 строчки в последней программе. Все должно работать
1
Larionova_Darya
0 / 0 / 0
Регистрация: 28.12.2016
Сообщений: 18
Завершенные тесты: 1
28.12.2016, 23:27  [ТС] 11
Fixer_84, огромное спасибо за различные варианты реализации
и еще одно большое спасибо, что откликнулись на просьбу, если честно не ожидала, что помощь придет так быстро)
0
likehood
965 / 814 / 390
Регистрация: 25.12.2016
Сообщений: 2,691
Завершенные тесты: 3
28.12.2016, 23:31 12
Цитата Сообщение от Larionova_Darya Посмотреть сообщение
вообще преподаватель сказала реализовать как-то так
C++
1
2
3
4
5
while k>0
{
    result*=n;
    k--;
}
Ну, если поставить скобочки вокруг k>0, то будет вполне рабочий код. Только в начале не забыть присвоить result = 1.
0
Fixer_84
1049 / 659 / 651
Регистрация: 30.04.2016
Сообщений: 2,234
28.12.2016, 23:34 13
Larionova_Darya, да, вы, также, можете посчитать степень через цикл while или for:

C++
1
2
3
4
5
6
7
8
9
10
int NumToPow(int n, int k)
{
int res = 1; 
while (k > 0)
{
res *= n;
k--;
}
return res;
}
0
Larionova_Darya
0 / 0 / 0
Регистрация: 28.12.2016
Сообщений: 18
Завершенные тесты: 1
28.12.2016, 23:40  [ТС] 14
Fixer_84,
попробовала с этой функцией, с примером тестовых данных 2^3(должно быть =10(8cc)), но мне выдало ответ в десятичном виде, т.е.= 8
подскажите, что сделать?
0
Fixer_84
1049 / 659 / 651
Регистрация: 30.04.2016
Сообщений: 2,234
28.12.2016, 23:50 15
Larionova_Darya, давайте просто переведем результат в восьмеричную систему...сейчас, подождите немного...

Добавлено через 2 минуты
Larionova_Darya, замените вывод вот на эту строчку:

C++
1
cout << oct << "Число возведенное в степень: " << NumToPow(A, N) << endl;
1
Larionova_Darya
0 / 0 / 0
Регистрация: 28.12.2016
Сообщений: 18
Завершенные тесты: 1
29.12.2016, 07:14  [ТС] 16
Fixer_84, УРРРРРАААААААА работает СПАСИБО!!!

Добавлено через 7 часов 21 минуту
Fixer_84, на других данных не работает...
вводится основание и степень должны тоже в 8сс

и здесь арифметические операции должны тоже выполнятся в 8сс
C++ (Qt)
1
2
[quote="Fixer_84;9954340"]res *= n;
k--;[/quote]
поможете?
0
Fixer_84
1049 / 659 / 651
Регистрация: 30.04.2016
Сообщений: 2,234
29.12.2016, 19:43 17
Larionova_Darya, здравствуйте! Что вы имеете ввиду, говоря, что на других данных не работает? Насколько я понимаю, вам не просто нужно вывести результат в восьмеричной системе счисления, но и сохранить его в переменную для дальнейшей работы? Тогда, нужно писать функцию перевода числа в восьмеричную систему, что, впрочем, не так уж сложно. И тогда, мы сможем применить ее для промежуточных вычислений. Отпишитесь, пожалуйста.

Добавлено через 13 минут
Larionova_Darya, я дописал для вас программу, но прежде чес отправить, хочу спросить, какой результат вы ожидайте, к примеру, для 15^2? Если у нас с вами все совпадет, я тут же отправлю вам решение.

Добавлено через 40 минут
Larionova_Darya, я не знаю, когда вы появитесь на форуме, поэтому отправляю решение. Я пока не знаю как возводить восьмеричное число в заданную степень, поэтому перевожу его в десятичную и возвожу, затем перевожу результат обратно в восьмеричную систему. Результат получается какой надо. Напишите, пожалуйста, все ли вас устраивает.

Добавлено через 5 минут
Larionova_Darya, вот код.

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <cmath>
#include <stdlib.h>
#include <algorithm>
 
using namespace std;
 
bool IfNotOct(int A)
{
    while (A > 0)
    {
        if ((A % 10 == 8) || (A % 10 == 9))
        {
            return true;
            break;
        }
        A /= 10;
    }
    return false;
}
 
int OctToInt(int N)
{
    int s = 0;
    string a = to_string(N);
    for (int i = 0; a[i]; i++)
    {
        s += (a[i] - '0') * pow(8, a.length() - i - 1);
    }
    return s;
}
 
int NumToPow(int n, int k)
{
    int res = 1;
    while (k > 0)
    {
        res *= OctToInt(n);
        k--;
    }
    return res;
}
 
int main()
{
    int A, N;
    do
    {
        cout << "Введите число:" << endl;
        cout << "A = ";
        cin >> A;
        if (IfNotOct(A))
            cout << "Число должно быть восьмеричным!" << endl;
    } while (IfNotOct(A));
    cout << "Введите степень:" << endl;
    cout << "N = ";
    cin >> N;
    cout << oct << "Число возведенное в степень: " << NumToPow(A, N) << endl;
    system("pause");
    return 0;
}
Добавлено через 1 минуту
Larionova_Darya, есть, также, функция перевода числа из десятичной системы в восьмеричную. Может быть, она вам пригодится:

C++
1
2
3
4
5
6
7
8
9
10
11
int DecToOct(int N)
{
    string s;
    while (N > 0)
    {
        s += N % 8 + '0';
        N /= 8;
    }
    reverse(s.begin(), s.end());
    return atoi(s.c_str());
}
Добавлено через 10 минут
Larionova_Darya, P.S. Извините, что сразу не понял, что вам нужно возвести число в степень именно в восьмеричной системе. Думал, вам просто нужно перевести результат в данную систему. Впрочем, теперь все работает. Я проверял через онлайн-сервисы. Результаты совпадают.
0
Larionova_Darya
0 / 0 / 0
Регистрация: 28.12.2016
Сообщений: 18
Завершенные тесты: 1
29.12.2016, 23:06  [ТС] 18
Fixer_84, доброго времени суток! Большое спасибо за ваш труд, извините, что из-за меня вы так заморачиваетесь.

К сожалению, программа выше мне не подходит. Переводить в десятичную систему счисления нельзя. Все расчеты, в данном случае вычитание и умножение, должны производится в восьмеричной СС.

Так же нужна проверка на отсутствие "8" и "9" как в числе-основании, так и в числе-степени.
Использование строки обязательно.

А еще преподаватель запрещает использовать потоковый ввод/вывод данных, но это не проблема, в традиционный вид переделывать умею.

P.S.:извините, что уже второй день вы мучаетесь с моей программой, но никто из моих знакомых не смог мне помочь и я от отчаяния написала сюда, спасибо вам за помощь.
И да, передаю привет из НГТУ. Преподаватель О.В., я вас "люблю".
0
MansMI
1448 / 1157 / 549
Регистрация: 08.01.2012
Сообщений: 4,509
30.12.2016, 05:27 19
C++
1
if (s[i] < '0' || s[i] > '8') return false;//break то там для чего?
а решается эта задача как в начальной школе учили, столбиком, там мы тоже оперировали набором цифр/символов,
ну и умножение - многократное сложение, компу пофиг, он не потеет

Добавлено через 11 минут
советчик, блин
C++
1
if (s[i] < '0' || s[i] > '7') return false;
0
Fixer_84
1049 / 659 / 651
Регистрация: 30.04.2016
Сообщений: 2,234
30.12.2016, 14:10 20
MansMI, я как раз после этого тоже вспоминал как мы числа переводили в школе. Только пока не помню как. Вот только тут не переводить надо, а в степень возводить. Буду пытаться помочь дальше.
0
30.12.2016, 14:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2016, 14:10

Представление чисел в восьмеричной и шестнадцатеричной системах счисления
У меня есть вопросы по переводу чисел из десятичной системы счисления в...

Возведение больших чисел в степень
Ребят, я не очень опытна в с++ . Но у меня возник вопрос. Я написала программу...

Возведение в степень для больших чисел
Всем привет ,когда возвожу число в большую степень например 9^31 ,то в...


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

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

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