首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言階乘累加取模 1000000 的作用:防止整數溢位

     編輯:程式設計綜合問答

程式碼片段

const int MODE = 1000000;
int factorial = 1;
for (j = 1; j <= i; j++)
    factorial = (factorial * j % MODE);
s = (s + factorial) % MODE;

解釋

MODE = 1,000,000 用於 **取模 (Modulo) 運算**,目的有二:

  1. 防止整數溢位:int 通常為 32 位元有號數,最大值約 21 億。階乘增長極快,13! = 6,227,020,800 已超過 INT_MAX,導致溢位產生負數或錯誤結果。每次乘法後取模,保證中間結果永遠在 [0, 999999] 範圍內,完全避免溢位。
  2. 題目要求:多數此類競賽題目 (如 POJ, HDOJ) 明確要求「輸出結果對 1,000,000 取餘」。

數學原理

利用模運算性質:(a * b) % m = ((a % m) * (b % m)) % m。
每一步乘法後立即取模,等價於最終結果取模,但中間值永不超過 m^2 (此處 10^12),32 位元 long long 可安全容納;若用 int 需確保 m * m < INT_MAX,此處 10^12 > 2*10^9,**實際應宣告 long long factorial 才安全**,原碼若用 int 乘法前仍可能溢位。

修正建議

const long long MODE = 1000000;
long long factorial = 1;
for (j = 1; j <= i; j++)
    factorial = (factorial * j) % MODE; // 先乘後模,long long 保證不溢位
s = (s + factorial) % MODE;

總結

取模 1000000 是為**防溢位且符合題目輸出要求**;實作時務必用 long long 儲存中間乘積,再取模存回。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved