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

C# 常用算法:計算 1^1 + 2^2 + 3^3 + ... + n^n 總和

     編輯:關於C語言

前言

計算 1^1 + 2^2 + 3^3 + ... + n^n 是經典數學程式設計練習。本文提供 C# 實作,包含基本雙重迴圈版本、效能優化版本、大數處理與單元測試。

基本實作:雙重迴圈


public class SumCalculator
{
    /// 
    /// 計算 1^1 + 2^2 + ... + n^n
    /// 
    /// 正整數
    /// 總和 (long 型別)
    public long CalculateSum(int n)
    {
        if (n < 1) throw new ArgumentException("n 必須 >= 1", nameof(n));
        
        long sum = 0;
        for (int i = 1; i <= n; i++)
        {
            long power = 1;
            // 計算 i^i
            for (int j = 1; j <= i; j++)
            {
                power *= i;
            }
            sum += power;
        }
        return sum;
    }
}

主程式測試


static void Main(string[] args)
{
    Console.Write("請輸入一個正整數: ");
    if (int.TryParse(Console.ReadLine(), out int n) && n > 0)
    {
        var calculator = new SumCalculator();
        long result = calculator.CalculateSum(n);
        Console.WriteLine($"1^1 + 2^2 + ... + {n}^{n} = {result}");
    }
    else
    {
        Console.WriteLine("輸入無效,請輸入正整數。");
    }
}

執行範例


請輸入一個正整數: 5
1^1 + 2^2 + 3^3 + 4^4 + 5^5 = 3413

驗證: 1 + 4 + 27 + 256 + 3125 = 3413 ✓

效能優化版本

1. 使用 Math.Pow (double 精度,大數失精)


public long CalculateSumMathPow(int n)
{
    long sum = 0;
    for (int i = 1; i <= n; i++)
    {
        sum += (long)Math.Pow(i, i);
    }
    return sum;
}

2. 快速冪演算法


public long CalculateSumFastPow(int n)
{
    long sum = 0;
    for (int i = 1; i <= n; i++)
    {
        sum += FastPow(i, i);
    }
    return sum;
}

private long FastPow(long baseNum, long exponent)
{
    long result = 1;
    while (exponent > 0)
    {
        if ((exponent & 1) == 1) result *= baseNum;
        baseNum *= baseNum;
        exponent >>= 1;
    }
    return result;
}

3. 遞迴 + 備忘錄 (避免重複計算)


private Dictionary _powerCache = new();

public long CalculateSumMemoized(int n)
{
    long sum = 0;
    for (int i = 1; i <= n; i++)
    {
        sum += GetPower(i, i);
    }
    return sum;
}

private long GetPower(int baseNum, int exp)
{
    if (_powerCache.TryGetValue(baseNum, out var cached)) return cached;
    
    long result = 1;
    for (int i = 0; i < exp; i++) result *= baseNum;
    _powerCache[baseNum] = result;
    return result;
}

大數處理:BigInteger

n > 15 時 long 會溢位,需用 System.Numerics.BigInteger。


using System.Numerics;

public BigInteger CalculateSumBigInteger(int n)
{
    BigInteger sum = 0;
    for (int i = 1; i <= n; i++)
    {
        BigInteger power = 1;
        for (int j = 1; j <= i; j++) power *= i;
        sum += power;
    }
    return sum;
}

// 測試 n=20
// 結果: 128443488822559164379225769

效能比較 (n=1000)

方法時間複雜度相對速度備註
雙重迴圈O(n²)1x (基準)簡單、無額外記憶體
Math.PowO(n)~10x 快double 精度,n>15 失精
快速冪O(n log n)~5x 快整數精確、適合大 n
備忘錄O(n²) 首次, O(n) 後續重複查詢極快適合多次查詢同 n

單元測試


[TestClass]
public class SumCalculatorTests
{
    [TestMethod]
    public void TestKnownValues()
    {
        var calc = new SumCalculator();
        Assert.AreEqual(1L, calc.CalculateSum(1));   // 1^1 = 1
        Assert.AreEqual(5L, calc.CalculateSum(2));   // 1 + 4 = 5
        Assert.AreEqual(32L, calc.CalculateSum(3));  // 1 + 4 + 27 = 32
        Assert.AreEqual(288L, calc.CalculateSum(4)); // 1 + 4 + 27 + 256 = 288
        Assert.AreEqual(3413L, calc.CalculateSum(5)); // 1 + 4 + 27 + 256 + 3125 = 3413
    }
    
    [TestMethod]
    [ExpectedException(typeof(ArgumentException))]
    public void TestInvalidInput() => new SumCalculator().CalculateSum(0);
}

數學背景

此數列 OEIS A001923:a(n) = Sum_{k=1..n} k^k。增長極快,n=10 即達 10405071317,n=20 超過 10^26。無簡化閉式公式,需逐項計算。

總結

基本雙重迴圈實作直觀易懂,適合教學與小數值。實務應用視 n 範圍選擇:n ≤ 15 用 long + 快速冪;n > 15 必須用 BigInteger;重複查詢場景加入備忘錄快取。算法核心在於冪運算優化與大數處理。

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