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

2021-02-14 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語言求最大公約數代碼及解析
    最大公因數,也稱最大公約數、最大公因子,指兩個或多個整數共有約數中最大的一個。a,b的最大公約數記為(a,b),同樣的,a,b,c的最大公約數記為(a,b,c),多個整數的最大公約數也有同樣的記號。求最大公約數有多種方法,常見的有質因數分解法、短除法、輾轉相除法、更相減損法。
  • C語言求水仙花數代碼解析
    水仙花數「水仙花數」又稱為「阿姆斯特朗數」。
  • C語言求回文素數代碼及解析
    兩位回文素數:11三位回文素數:101、131、151、181、191、313、353、373、383、727、757、787、 797、 919、 929本題要求解的問題是:求出所有不超過1000的回文素數。問題分析本題要使用判斷素數的方法,並且要解決如何求一個整數的迴文數。
  • C語言求梅森素數代碼及解析
    試求出指數n<20的所有梅森素數。問題分析要編程求解的問題是找出指數n<20的所有梅森素數。根據梅森素數的定義,我們可以先求出n<20的所有梅森數,再逐一判斷這些數是否為素數。如果是素數,則表示該數為梅森素數,列印輸出即可;否則不是梅森素數。算法設計要求出n<20的所有梅森數,因此在本題的算法設計中需要釆用循環結構。
  • 寫出高效優美的單片機C語言代碼
    程序能跑起來並不見得你的代碼就是很好的c代碼了,衡量代碼的好壞應該從以下幾個方面來看1,代碼穩定,沒有隱患。選擇一種合適的數據結構也很重要,比如你在一堆隨機存放的數中使用了大量的插入和刪除指令,那使用鍊表要快得多。數組與指針語句具有十分密碼的關係,一般來說,指針比較靈活簡潔,而數組則比較直觀,容易理解。對於大部分的編譯器,使用指針比使用數組生成的代碼更短,執行效率更高。但是在Keil中則相反,使用數組比使用的指針生成的代碼更短。
  • C語言中「c=a+b」,這種結構合理嗎?
    C語言會同意一些"令人震驚"的結構,下面的結構是合法的嗎,我們來看看幾個例子。 c = a+++b; 以下代碼是合法的嗎,咋的一看不禁有這樣的疑問?
  • 小升初整數考點3:省略尾數求近似數
    1、整數的改寫:為了讀寫方便,常常把一個較大的數簡寫成用「萬」或「億」作單位的數,改寫後的數就是原數的準確數。我們先找到萬位或億位,再在萬位或億位上數的右下角點上小數點,就得到一個小數,如果這個小數的末尾有「0」,末尾的0可以省略不寫,並在這個小數後面寫上「萬」或「億」,要用「=」連接原數和改寫後的數。
  • 如何寫出高效優美的單片機C語言代碼?
    程序能跑起來並不見得你的代碼就是很好的c代碼了,衡量代碼的好壞應該從以下幾個方面來看1,代碼穩定,沒有隱患。本文引用地址:http://www.eepw.com.cn/article/201611/319838.htm2,執行效率高。3,可讀性高。4,便於移植。
  • 一行代碼求出三個數中的最大值
    本文轉載自【微信公眾號:五角錢的程式設計師,ID:xianglin965】經微信公眾號授權轉載,如需轉載與原文作者聯繫一起學習、成長、溫情的熱愛生活圖丨pexels如何求出三個數中的最大數首先我們來看版本一:/*** 求三個數中的最大數 * 版本一 **/public class ThreeMax1 { public static void main(String[] args
  • 【C語言程序設計】C語言求親密數!
    問題描述如果整數A的全部因子(包括1,不包括A本身)之和等於B;且整數B的全部因子(包括1,不包括B本身)之和等於A,則將整數A和B稱為親密數。
  • C語言初學者常見問題與錯誤
    ",a); c=5/9*(a-32); printf("攝氏溫度為%4.2f",c); return 0; } 解析: C語言中,兩個整型數相除,如果不能除盡,那麼小數部分會直接被丟棄,即「截尾」。
  • C語言編寫程序求水仙花數
    C語言編寫程序求水仙花數水仙花數是一個數學問題,其實質是一個三位數,個位數的立方加十位數的立方加百位數的立方之和等於這個三位數本身。例如153=1*1*1+5*5*5+3*3*3,即153=1+125+27。
  • C語言求給定範圍內的所有素數代碼及解析
    問題描述求給定範圍start〜end之間的所有素數。
  • C語言編程:驗證哥德巴赫猜想
    a = b + c(其中a是大於等於6的整數,b和c是素數)這個問題就等價於:對於一個給定的大於等於4的偶數a,怎麼找到素數b和c呢?可以用循環的方法,把b的值從3循環到a-3,那麼對應的c的值就是a-3到3。然後我們分別對每一組的b和c值進行是否是素數的判斷。
  • C語言實現任意進位轉換代碼及解析
    二進位、八進位、十六進位相互轉換:先轉換成十進位再轉換成其他進位;或者按照其對應關係進行轉換(三位二進位數對應一位八進位數,四位二進位數對應一位十六進位數)。本例題按照前一種轉換方式進行編程。算法設計十六進位是由 0~F 這一組固定的數字來表示,所以釆用字符數組進行存儲。
  • C語言if else語句
    if-else語句在C語言中,使用if語句進行判斷,請先看下面的代碼:#include <stdio.h>int main(){int age;printf("請輸入你的年齡:");scanf("%d", &age);if(age>=18){
  • C語言、Python、Scratch語言比較三個數大小的方法
    首先我們先來看一下C語言中如何比較三個數的大小:這是最容易理解的方法在之前判斷兩個數大小的基礎上,在if語句中嵌套一個if語句,經過多次判斷得出最大數。這樣可以再引用函數中將引用的函數變為max(a,b,c)或者在比較兩個數的函數在主程序裡變為max=max(max(a,b),c)下面介紹一個三元運算符,這個運算符會使程序進一步簡化,而且看起來更加的直觀。它的一般形式如下:表達式1?
  • C/C+編程筆記:C語言入門題之正倒金字塔,正反三角形代碼詳解
    C跟C++在很多方面也是兼容的,c是c++的基礎。 再者c能從很大的程度上幫你了解計算機的發展史,數據結構等方面的知識,很多軟體、甚至作業系統中的很大部分是用c來實現的。
  • C語言列出真分數序列代碼及解析
    方法一:求分子小於60的最簡分數,對分子採用窮舉的方法。根據最簡分數定義知:分子分母的最大公約數為1,利用最大公約數的方法,判定分子與60是否構成真分數。方法一:求最大公約數一般採用輾轉相除的思想,具體步驟如下。 1. 用較大的數num1除以較小的數num2,得到的餘數存儲到變量temp中,temp=num1%num2。2. 上一步中較小的除數num2和得出的餘數temp構成新的一對數,並分別賦值給num1和num2,繼續做上面的除法。3.
  • 10個經典的C語言面試基礎算法及代碼
    C語言實現的代碼如下:Enter number of terms: 10Fibonacci Series: 0+1+1+2+3+5+8+13+21+34+也可以使用下面的原始碼:/* Displaying Fibonacci series up to certain number entered by user.