Yahoo Answers is shutting down on May 4th, 2021 (Eastern Time) and the Yahoo Answers website is now in read-only mode. There will be no changes to other Yahoo properties or services, or your Yahoo account. You can find more information about the Yahoo Answers shutdown and how to download your data on this help page.

Anonymous
Anonymous asked in 電腦與網際網路程式設計 · 2 decades ago

[20點]想了兩個禮拜沒辦法才求助!麻煩幫我想這1個程式!!

No.1 Write a C program that will compute and print n and 2的n次方 for values n = 1 through 35 . The output from your program should look similar to the following :

i i____________2 ^ i i

==================

1________________2

2________________4

3________________8

... lines of output removed ...

30________________1073741824

31________________-2147483648

32________________0

33________________0

34________________0

35________________0

提示 : You should find that when n reaches 31 , an error in the evaluation will occur because the integer exceeds the maximum value that can be stored by the int data type.

Although the exact details of how subsequent values of n are handled will be system dependent , most systems will simply start over again beginning with zero .

請 告訴我這題在問什麼,大概運用了哪些觀念,可以的話幫我翻譯

ps. 回答之後會有問題 , 能幫我解答更詳細就選你最佳解答 ! 先謝謝!!!

Update:

*不會丟票選*

1 Answer

Rating
  • 2 decades ago
    Favorite Answer

    又是你,唉!你是程式寫不出來還是英文看不懂。

    2005-11-05 18:21:56 補充:

    寫一個C語言的程式,計算2^n值(n=1~35)並輸出,格式如下:

    i i____________2 ^ i i

    ==================

    1________________2

    2________________4

    3________________8

    ... lines of output removed ...

    30________________1073741824

    31________________-2147483648

    32________________0

    33________________0

    34________________0

    35________________0

    hint:你將發現n=31時,會出現錯誤的值,2^31的值已經超過有符號整數(int)形態所能表達最大的值。電腦所能表達精確的2^n值的最大n數跟系統有很大關系,很多系統簡單表示再一次超過之後的值都為零(由2^32開始都表示為零,因為溢位發生)。這一題主要考你溢位的關念。

    以下兩個程式運用power函式,每一次都要重頭算2^n值,大大增加運算量,由檔案大小可看出,針對這個題目不算是好的程式,不過很強的Compiler會修正這個問題,它會把程式最佳化,例如gcc。

    程式2.1,整數表示,最大值已超過表示的範圍,產生溢位,(執行檔大小184kB)

    #include <stdio.h>

    #include <math.h>

    int main(){

    int n,temp;

    for(n=1;n<=35;n++)

    printf("%2d___________%d\n",n,(int)pow(2,n));

    return 0;

    }

    程式2.2,浮點表示,最大值還在表示的範圍內,不會溢位,(執行檔大小184kB)

    #include <stdio.h>

    #include <math.h>

    int main(){

    int n,temp=2;

    for(n=1;n<=35;n++)

    printf("%2d___________%f\n",n,pow(2,n));

    return 0;

    }

    以下兩個程式運用了,前一個值跟後一個值有兩倍的關系,可以減少運算量。

    程式1.1,整數表示,最大值已超過表示的範圍,產生溢位(執行檔大小152KB)

    #include <stdio.h>

    int main(){

    int n,temp=1;

    for(n=1;n<=35;n++)

    printf("%2d___________%d\n",n,temp=temp*2);

    return 0;

    }

    程式1.2,浮點表示,最大值還在表示的範圍內,不會溢位(執行檔大小168KB)

    #include <stdio.h>

    int main(){

    int n;

    float temp=1;

    for(n=1;n<=35;n++)

    printf("%2d___________%f\n",n,temp=temp*2);

    return 0;

    }

    以下是最好的寫法,只要是2倍數處理器通常用位移的方式處理,ARM跟DSP處理器通常有快速位移裝置(Barrel Shifter)用來處理這方面的指令。它更有乘法器(Multiplier)來處理非2倍數的值,也是ARM跟DSP在運算能力比x86強的原因,適合影像處理跟數位信號處理。

    以下兩個程式,因無法用浮點數表示,所以無法表示n大於31的值,就算溢位發生也無能為力。

    程式3.1,他無法判斷溢位發生,無法把溢位後的值變成零,更無法修成正確值。(執行檔大小152kB)

    #include <stdio.h>

    int main(){

    int n,temp=1;

    for(n=1;n<=35;n++)

    printf("%2d___________%u\n",n,temp<<n);

    return 0;

    }

    程式3.2,經修改後,會判斷溢位發生,會把溢位後的值變成零,但無法修成正確值。(執行檔大小152kB)

    #include <stdio.h>

    int main(){

    int n,temp=1;

    for(n=1;n<=35;n++)

    printf("%2d___________%u\n",n,temp<<=1);

    return 0;

    }

Still have questions? Get your answers by asking now.