Ошибка с динамическим массивом char

297
19 декабря 2017, 18:35

Доброго времени суток, возникла следующая проблема: Нужно возвести в степень(n>30) число x. c++ я только начал изучать, не будьте слишком строги, но критика приветствуется.

#include "stdafx.h"
#include <iostream>
using namespace std;
int PowByValue(int x, int n)
{
int rez = 1;
char* rezchar = new char[];
if (n > 30)
{
    int size = sizeof(rezchar) / sizeof((char));
    rezchar[size] = { 1, 0, 7, 3, 7, 4, 1, 8, 2, 4 };
    for (int j = 0; j <= sizeof(rezchar) / sizeof((char)); j++)
    {
        rez++; //функция не  до конца написано, здесь предполагается, что 
                                                                      каждый 
     элемент
    }          //массива будет умножаться на x,и если больше 10, то след элемент +1
    return rez;
}
for (int i = 1; i <= n; i++)
    rez *= x;
return rez;
}
void PowByReference(int &x, int n)
{
int rez = 1;
for (int i = 1; i <= n; i++)
    rez *= x;
x = rez;
}
int main()
{
int x = 2; int n = 30;
cout << PowByValue(x, n) << endl;
PowByReference(x, n);
cout << x;
system("pause");
return 0;
}
Answer 1

Не хочу тебя разочаровывать, но...

ты выводишь значение в int, которое может находиться в диапазоне -2^31...2^31, т.е. в 30 степень ты можешь возвести только число 2.

вторая ошибка - в функции ты выделяешь память и используешь массив rezchar, но не очищаешь потом память, да и снаружи rezchar нигде никак не используется (функция возвращает int)

Если ты хочешь использовать операции с БОЛЬШИМИ числами, то это делается так:

1) вместо int (2^32) используется массив unsigned int[size], который будет описывать большие числа (2^(size*32))

2) для этих БОЛЬШИХ чисел пишешь функции сложения, вычитания, умножения, деления (если не ограничиваться размером числа, то умножение скорее всего будет приводить к созданию нового числа/нового массива большего размера max_size3 = max_size1 * max_size2)

и вот после этого можно реализовать уже и функцию степени - можно топорно как многократное умножение, а можно пооптимальнее

Answer 2

вместо sizeof(rezchar)/sizeof(char) я бы вызвал strlen(rezchar), и вообше много лишнего и ошибок - лучше писать снова и использовать std::string функцию to_string, а лучше std::bitset, или std::valarray,

Answer 3
#include <stdio.h>
#include <math.h>
int main(int argc, char **argv){
    double x= 2;
    double n = 20;
    double res = pow(x,n);
    printf("%f^%f=%f\n",x,n,res);
    return 0;
}

?

READ ALSO
Проверка целостности S19(SREC) файла C++

Проверка целостности S19(SREC) файла C++

У меня есть файл прошивки для контроллера в формате S19 (SREC)Как я понял внутри файла есть чексуммы

214
Сборка программы, использующей OpenSSL, для разных линуксов

Сборка программы, использующей OpenSSL, для разных линуксов

Есть кроссплатформенная программа заказчика под Window/OsX/Linux - C++/Qt/QmlС линуксами возникает проблема линковки Qt с openssl

214
Qt поэлементный скролл

Qt поэлементный скролл

Вопрос такой, есть QScrollArea с некоторым количеством кнопок на нейДля области установлен скролл через QScroller::grabGesture(viewport(), QScroller::TouchGesture); Как сделать,...

171
Плавное увеличение частоты выполнения

Плавное увеличение частоты выполнения

Пишу код на ардуино, раз в 1 мс подаю ток на нужный мне пин пусть это делает функция pin()

231