首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

「人見人愛的A^B」模冪運算:快速冪取模與大數邊界處理

     編輯:關於C

問題描述

計算A^B mod 1000,多組輸入,A=0且B=0結束。A,B均為非負整數。

核心算法:快速冪取模 O(log B)

int mod_pow(int a, int b, int mod) {
    long long res = 1, base = a % mod;
    while (b > 0) {
        if (b & 1) res = (res * base) % mod;
        base = (base * base) % mod;
        b >>= 1;
    }
    return (int)res;
}

完整程序

#include <stdio.h>

int main() {
    int n, m;
    while (scanf("%d %d", &n, &m) == 2) {
        if (n == 0 && m == 0) break;
        printf("%d\n", mod_pow(n, m, 1000));
    }
    return 0;
}

關鍵點解析

要點說明
中間結果溢出用long long承載乘積,1000*1000=1e6遠小于2^31,但良好習慣
模數分配律(a*b)%m = ((a%m)*(b%m))%m,每步取模防止溢出
B=0情況A^0 = 1 (含0^0,題目通常定義為1或作為終止條件)
負數處理題目非負整數,無需處理;若擴展至負指數需模逆元

變體:輸出前導零(如001)

printf("%03d\n", mod_pow(n, m, 1000));

擴展:大模數(10⁹+7)與大指數(10¹⁸)

long long mod_pow_ll(long long a, long long b, long long mod) {
    __int128 res = 1, base = a % mod; // GCC/Clang支援128位
    while (b) {
        if (b & 1) res = (res * base) % mod;
        base = (base * base) % mod;
        b >>= 1;
    }
    return (long long)res;
}

數學基礎:歐拉定理優化(當模數非質數)

φ(1000) = 1000 × (1-1/2) × (1-1/5) = 400

若gcd(A,1000)=1,則A^400 ≡ 1 (mod 1000),可將指數B %= 400。但1000=2³×5³非質數,且A可能與1000不互質,通用快速冪更穩健。

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