C語言求高次方數的尾數代碼解析

2021-02-20 Linux公社
問題描述

求13的13次方的最後三位數。

問題分析

許多初學者看到本題最容易想到的方法就是:將13累乘13次後截取最後三位即可。但是計算機中存儲的整數有一定的範圍,超出某範圍將不能正確表示,所以用這種算法不可能得到正確的結果。實際上,題目僅要求後三位的值,完全沒有必要把13的13次方完全求出來。

算法設計

手工計算13的13次方的步驟如下:



研究乘法的規律會發現:乘積的最後三位的值只與乘數和被乘數的後三位有關,與乘數和被乘數的高位無關。利用這一規律,在計算下一次的乘積時,我們只需用上次乘積的後三位來參與運算(即在求第三次乘積時,上次的乘積2197並不需要都參與運算,只取其後三位197再次與13相乘即可)。求某數的後三位的算法用某數對1000取模。編程過程中,將累乘得到的積存儲到變量last中,在進行下一次相乘之前先截取last的後三位再相乘,即:last%1000*13,將結果存儲到last中:last=last*x(x的值為13)%1000。 因第一次相乘時用到變量last的初值,故在定義時給last賦初值,或在參與計算之前給last賦初值1。
下面是完整的代碼:

#include <stdio.h>
int main()
{
    int i, x, y, last=1;  /*變量last保存求得的x的y次方的部分積的後三位*/
    printf("輸入 x 和 y:\n");
    scanf("%d %d", &x, &y);
    for(i=1; i<=y; i++)  /*x自乘的次數y*/
        last = last * x % 1000;  /*將last乘x後對1000取模,即求積的後三位*/
    printf("最後三位數是:%d\n", last);
 
    return 0;
}

運行結果:

linuxidc@linuxidc:~/www.linuxidc.com$ ./linuxidc.com
輸入 x 和 y :
12 12
最後三位數是:256
linuxidc@linuxidc:~/www.linuxidc.com$ ./linuxidc.com
輸入 x 和 y :
8 8
最後三位數是:216
linuxidc@linuxidc:~/www.linuxidc.com$ ./linuxidc.com
輸入 x 和 y :
13 13
最後三位數是:253

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新連結地址:https://www.linuxidc.com/Linux/2019-01/156341.htm

喜歡我就支持我

相關焦點

  • C語言求水仙花數代碼解析
    水仙花數「水仙花數」又稱為「阿姆斯特朗數」。
  • C語言求回文素數代碼及解析
    兩位回文素數:11三位回文素數:101、131、151、181、191、313、353、373、383、727、757、787、 797、 919、 929本題要求解的問題是:求出所有不超過1000的回文素數。問題分析本題要使用判斷素數的方法,並且要解決如何求一個整數的迴文數。
  • 【C語言程序設計】C語言迴文數怎麼求?
    問題分析對於要判定的數n計算出其平方後(存於a),按照「迴文數」的定義要將最高位與最低位、次高位與次低位……進行比較,若彼此相等則為迴文數。此算法需要知道平方數的位數,再一一將每一位分解、比較,此方法對於位數已知且位數不是太多的數來說比較適用。此問題可藉助數組來解決。
  • C語言 | 求小於1000數的平方根
    「要成為絕世高手,並非一朝一夕,除非是天生武學奇才,但是這種人…萬中無一」這道理放在C語言學習上也一併受用
  • C語言中的奇技淫巧
    前言學習C語言的過程中,總會遇到很多令人眼前一亮的代碼,尤其是你寫了幾十行的代碼,別人只用了簡單幾行的遞歸就實現的功能
  • C語言太簡單?這14道C語言謎題,你能答對幾個?
    本文展示了14個C語言的迷題以及答案,代碼應該是足夠清楚的,而且有相當的一些例子可能是我們日常工作可能會見得到的。
  • C語言實現魔方陣代碼及解析
    假定陣列的行列下標都從0開始,則魔方陣的生成方法為:在第0行中間置1,對從2開始的其餘n2-1個數依次按下列規則存放:(1) 假定當前數的下標為(i,j),則下一個數的放置位置為當前位置的右上方,即下標為(i-1,j+1)的位置。(2) 如果當前數在第0行,即i-1小於0,則將下一個數放在最後一行的下一列上,即下標為(n-1,j+1)的位置。
  • c語言中求矩陣的逆只要10行!!!
    核心的部分真的10行就夠了,其他的都是為這個代碼更加generalization…首先要用c語言做矩陣的逆運算,就要知道用手咋求矩陣的逆的首先翻開你的線性代數,兩種辦法:一種是:
  • 【C語言程序設計】C語言統計單詞個數,單詞個數算法
    在以往,要麼我們一個一個地數;要麼我們估算一行的單詞數,然後用行數進行估算。第一種方法太費時,若是長篇大論,那幾乎是不可能統計的;而第二種方法不太準確。這就給我們留下了一個問題:如何又快、又準確地統計一篇英文文章中的單詞數?
  • C語言 | 選擇1或2調用max或min
    在編程方面有著天賦異稟的人畢竟是少數,我們大多數人想要從C語言小白進階到高手,需要經歷的是日積月累的學習。那麼如何學習呢?當然是每天都練習一道C語言題目!!作者閆小林白天搬磚,晚上做夢。我有故事,你有酒麼?例36:C語言實現輸入兩個整數,然後讓用戶選擇1或者2,選擇1是調用max,輸出兩者中的大數,選擇2是調用min,輸出兩者中的小數。
  • C語言 | 求矩陣對角線元素和
    「要成為絕世高手,並非一朝一夕,除非是天生武學奇才,但是這種人…萬中無一」這道理放在C語言學習上也一併受用
  • 一直以為自己C學的挺好:直到看了這幾個C代碼,連聲說出「臥槽」
    例1 首先來看一下,大師是如何求圓周率的,一口君實在詞窮,first臥槽。 #include <stdio.h>    long a=10000,b=0,c=10000,d,e,f[10001],g;    void main()    {    for(;b !
  • C語言 | 輸出水仙花數
    「要成為絕世高手,並非一朝一夕,除非是天生武學奇才,但是這種人…萬中無一」這道理放在C語言學習上也一併受用
  • C語言while語句
    在C語言中,共有三大常用的程序結構:前面講解了順序結構和選擇結構,本節開始講解循環結構。
  • C語言 | 判斷迴文數
    「要成為絕世高手,並非一朝一夕,除非是天生武學奇才,但是這種人…萬中無一」這道理放在C語言學習上也一併受用
  • 經典C語言程序設計100例 (80~100)
    代表的兩位數,8*??的結果為兩位數,9*??的結果為3位數。求??代表的兩位數,及809*??後的結果。= '\0')    {        n = n*8 + *p - '0';        p++;    }    printf("%d", n);        return 0;}--【程序83】題目:求0—7所能組成的奇數個數
  • 【必讀乾貨】5個讓人驚呼「臥槽」的C語言例子,你一定不能錯過
    例1首先來看一下,大師是如何求圓周率的,一口君實在詞窮,first臥槽。= c; f[b++] = a/5);    for(; d=0,g=c*2,c>5000; c--,printf("%.4d",e+d/a),e=d%a)    for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);     } 執行結果:
  • 看了這幾個C語言例子,你一定和我一樣連說5個臥槽...
    例1首先來看一下,大師是如何求圓周率的,一口君實在詞窮,first臥槽。這些代碼是IOCCC 【(The International Obfuscated C Code Contest)國際C語言混亂代碼大賽是一項國際編程賽事
  • C語言 | 最大公約數最小公倍數
    「要成為絕世高手,並非一朝一夕,除非是天生武學奇才,但是這種人…萬中無一」這道理放在C語言學習上也一併受用
  • C語言 | 統計字符中英文 空格 數字
    「要成為絕世高手,並非一朝一夕,除非是天生武學奇才,但是這種人…萬中無一」這道理放在C語言學習上也一併受用