2011-04-30 64 views
2

我試圖計算 「2^0 + 2^1 + 2^2 + ... + 2^14」,使用下面的程序(我是新手,只能計算指數乘以一定的時間)。結果應該是32767,但是我跑,並得到270566475,我想了很長,但想不通爲什麼...問題在C

#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; 
} 

那麼什麼不對的???謝謝!!!

回答

2

看看本身的內部循環。它試圖計算一個具體的值i2^i

exponent不會在每次啓動1。所以你進入這個循環已經有一些非常大的價值。

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

    sum += exponent; 
} 

現在你已經復位exponent(這是明確的,是不是指數,不過在計算結果)爲2

+0

您不必使用內循環,因爲它可以只用外循環來完成,如上述由馬塞洛..... – Pushpendra 2011-04-30 14:01:28

+0

哦,是的回答~~初始化!非常感謝你!! – asunnysunday 2011-04-30 14:09:54

7

每一個新的電源不需要內循環。直接在外循環內執行exponent *= 2一次。順便說一句,我覺得你有的sum += ...後做

此外,你可以從sum = 0i = 0開始,這更接近你所描述的數學。

+1

呀!~~~後你告訴我,我真的不知道爲什麼,我在那個複雜的方式做到了,thankkkkks! – asunnysunday 2011-04-30 14:00:19

2

如果你有權利建立一個功能更好用遞歸函數像這樣做:

#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; 
} 

兩個代碼工作

+1

你可以重複使用這個函數來做例如3^3,4^4你想要的任何值(x^exp)。 – 2011-04-30 14:01:08

+0

不要在需要迭代的地方推薦遞歸。 (同樣不要對簡單的錯誤做出複雜的解決方案。) – 2011-04-30 14:13:53

+0

哦,謝謝!但對於我來說,像權力這樣的東西,argc是比拉丁現在更神祕的符號,呵呵~~非常感謝! – asunnysunday 2011-04-30 14:13:55