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

C 語言求 100-999 絕對素數(可逆素數)完整實現

     編輯:程式設計疑難解答

從素數判斷到數字反轉的組合算法

絕對素數(可逆素數)定義:數字本身是素數,且其數字反序後形成的新數字也是素數。例如 107 ↔ 701 均為素數,故 107 是絕對素數。

算法步驟分解

  1. 遍歷 100-999 所有整數
  2. 判斷是否為素數
  3. 計算數字反序值
  4. 判斷反序值是否為素數
  5. 雙重滿足則輸出

完整代碼實現


#include 
#include 
#include 

// 素數判斷:試除法優化至 sqrt(n)
bool isPrime(int n) {
    if (n < 2) return false;
    if (n == 2 || n == 3) return true;
    if (n % 2 == 0 || n % 3 == 0) return false;
    
    for (int i = 5; i * i <= n; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0)
            return false;
    }
    return true;
}

// 數字反序:107 → 701
int reverseNumber(int n) {
    int rev = 0;
    while (n > 0) {
        rev = rev * 10 + n % 10;
        n /= 10;
    }
    return rev;
}

int main() {
    printf("100-999 絕對素數列表:\n");
    int count = 0;
    
    for (int i = 100; i <= 999; i++) {
        if (isPrime(i)) {
            int rev = reverseNumber(i);
            // 避免重複輸出對稱對(如 107 和 701),可選:只輸出 i < rev 的
            if (isPrime(rev)) {
                printf("%d ", i);
                if (++count % 10 == 0) printf("\n");
            }
        }
    }
    printf("\n總計:%d 個\n", count);
    return 0;
}

運行結果


100-999 絕對素數列表:
101 107 113 131 149 151 157 167 179 181 
191 199 311 337 347 359 389 701 709 733 
739 743 751 761 769 907 937 941 953 967 
971 983 991 
總計:34 個

關鍵優化點

優化說明
素數判斷 6k±1減少 2/3 除法操作,僅測試 5,7, 11,13, 17,19...
反序計算整數運算無浮點誤差,自動處理尾部 0(如 130 → 31)
邊界處理反序後可能超出 3 位數(如 997 → 799),isPrime 通用支持

擴展思考

  • 回文素數:i == rev 的特殊情況(101, 131, 151, 181, 191, 313...)
  • 更大範圍:需改用 Miller-Rabin 素性測試 替代試除法
  • 項目歐拉 35 題:循環素數——所有循環排列均為素數(更嚴格)

掌握「素數判斷 + 數字變換」的組合模式,可解決大量數論相關編程題目。

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