Проблема с циклом в C - PullRequest
       22

Проблема с циклом в C

2 голосов
/ 30 апреля 2011

Я пытаюсь вычислить "2 ^ 0 + 2 ^ 1 + 2 ^ 2 + ... + 2 ^ 14", используя следующую программу (я новичок и могу вычислить показатель степени только умножением себя определенные времена). Результат должен быть 32767, но я запустил его и получил 270566475, долго думал, но не могу понять, почему ...

#include <stdio.h>

int main(void)
{
   int i, e, exponent, sum;

   e = 1;
   exponent = 1;
   sum = 1;

   for (i = 1; i <=14; i++)
   {
       for (e = 1; e <= i; e++)
       {
          exponent *= 2;
       }

       sum += exponent;
   }

   printf("%d\n", sum);

   return 0;
}

Так что с этим не так ??? Спасибо !!!

Ответы [ 3 ]

7 голосов
/ 30 апреля 2011

Вам не нужен внутренний цикл. Просто выполните exponent *= 2 один раз, прямо внутри внешнего цикла. Кстати, я думаю, что вы должны сделать это после sum += ....

Кроме того, вы можете начать с sum = 0 и i = 0, что ближе к описанной вами математике.

2 голосов
/ 30 апреля 2011

Если у вас есть право на создание функции, лучше сделать это с помощью рекурсивной функции:

#include <stdio.h>

int power(int x, int exp) {
    if (exp == 0)
        return 1;
    else
        return x * power(x, exp-1);
}

int main (int argc, const char * argv[])
{
    int i;
    int sum = 0;
    for (i = 0; i <= 14; i++) {
        sum += power(2, i);
    }

    printf("%d",sum);
    return 0;
}

Надеюсь, это поможет.

Вам нужен только один цикл, потому что у каждого из вас уже есть результат n-1. Я исправил твой код, он работает.

#include <stdio.h>

int main (int argc, const char * argv[])
{
    int i, e, exponent, sum;

    e = 1;
    exponent = 1;
    sum = 1;

    for (i = 1; i <= 14; i++)
    {
        exponent *= 2;
        sum += exponent;
    }

    printf("%d\n", sum);

    return 0;
}

Оба кода работают

2 голосов
/ 30 апреля 2011

Посмотрите на свой внутренний цикл сам по себе. Он пытается вычислить для одного конкретного значения i, 2^i.

Но exponent не начинается с 1 каждый раз. Таким образом, вы входите в этот цикл с exponent уже очень большим значением.

for (i = 1; i <=14; i++)
{
    exponent = 1;
    for (e = 1; e <= i; e++)
    {
        exponent *= 2;
    }

    sum += exponent;
}

Теперь вы сбрасываете exponent (что, понятно, вовсе не показатель, а вычисленный результат) для каждой новой степени 2.

...