Что не так с этой степенной функцией? - PullRequest
0 голосов
/ 21 сентября 2018

Я делаю свою собственную функцию мощности (см. Ниже).Это работает, но вход входит в цикл только один раз, так что если в основном у меня есть: x=power(10, 3); вывод 100 вместо 1000.Есть ли у вас какие-либо идеи?Заранее спасибо.

 int power(int a, int b) {
    int p=a;
    for (int i=1; i<=b; i++) {
        if ((b!=1) && (b!=0)) {
            a= p*a;
        }
        if ((b=1)) {
            a=a;
        }
        if ((b=0)) {
            a=1;
        }
    }
    return(a);
}

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

Выходное значение равно 100, поскольку во втором и третьем операторе if вы назначаете переменной b новый номер.

int power(int a, int b){
    int p=a;
    for (int i=1; i<b; ++i){
        if((b!=1) && (b!=0)){
            a= p*a;
        }
        if ((b==1)){
            a=a;
        }
        if ((b==0)){
            a=1;
        }    
    }
    return(a);
}
0 голосов
/ 21 сентября 2018
  1. Вы устанавливали b с операторами b=1 и b=0 в отличие от сравнения b с 1 или 0
  2. Ваше условие цикла for включало дополнительную итерацию, которая приводит кнеправильный вывод.Вы хотите i < b, а не i <= b.
  3. Вы пытаетесь обрабатывать особые случаи в вашем цикле for, но они могут быть легко обработаны вне его (например, 0-я степень, 1-я степень, 1 для любой степени)

Вот ваш код с вышеуказанными исправлениями

int power(int a, int b){

    /* 1 times 1 is always 1 */
    if(a == 1) return a;

    /* any number to the 0 power is always 1 */
    if(!b) return 1;

    /* any number to the 1 power is always itself */
    if(b == 1) return a;

    int p = a;

    for (int i = 1; i < b; i++){

        a = p*a;

    }

    return a;

}

Я проверял это здесь для степеней 2 от 0 до 10.

0 голосов
/ 21 сентября 2018
  • , если вам не нужно работать с отрицательными значениями: используйте unsigned
  • , рекурсивная функция использует только один тест , поэтому она рекурсивнаможно развернуть
  • в нерекурсивной версии также используется один тест : условие цикла
  • Примечание: gcc -O2 генерирует точно такой же код для этих двух функций

unsigned power1(unsigned val, unsigned exp)
{
if (!exp) return 1;
return val * power1(val, exp-1);
}

unsigned power2(unsigned val, unsigned exp)
{
unsigned result = 1;

while (exp--) result *= val;

return result;
}
0 голосов
/ 21 сентября 2018

Вот более простая версия (для лучшего понимания):

int power(int a, int b)
{
    int p=1;                   //CHANGE
    for (int i=0; i<b; i++)    //CHANGE
    {
       p= p*a;                 //CHANGE
    }

    return (p);                //CHANGE
}

В вашем коде главная ошибка - инициализация p=a, а затем a=p*a - даже если 1 передается как b значение равно 100 в случае базы 10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...