C#,初学琼林(06)——幂的常规算法与递归算法、模幂(幂模)的快速算法及其C#源程序

1、幂 (Pow)的计算

幂 (Pow)是数值计算的基本方法之一。

幂运算是一种关于幂的数学运算。同底数幂相乘,底数不变,指数相加。同底数幂相除,底数不变,指数相减。幂的乘方,底数不变,指数相乘。

掌握正整数幂的运算性质(同底数幂的乘法、幂的乘方、积的乘方、同底数幂的除法),能用字母式子和文字语言正确地表述这些性质,并能运用它们熟练地进行运算。
 

幂运算的六个基本公式(高中):

1、同底同指数幂的加减法公式,字母和指数均不变,系数相加减;

2、同底数幂乘法公式,底数不变,指数相加;

3、同底数幂除法公式:底数不变,指数相减;

4、不同底同指数幂的乘法公式,底数相乘,指数不变;

5、不同底同指数幂除法公式,底数相除,指数不变。

6、幂的乘方公式,底数不变,指数相乘。

2、原始算法

private void button1_Click(object sender, EventArgs e)
{
    int a = 11;
    int n = 4;
    int b = 1;
    while (n > 0)
    {
        b = a * b;
        n--;
    }

    n = 4;
    MessageBox.Show(a + "的" + n + "次幂= " + b, "幂的计算");
}

3、递归算法

private void button1_Click(object sender, EventArgs e)
{
    int a = 11;
    int n = 4;
    MessageBox.Show(a + "的" + n + "次幂= " + Pow(a, n), "幂的计算");
}

/// <summary>
/// 计算(整数)幂的递归算法
/// </summary>
/// <param name="a">基数</param>
/// <param name="n">幂次</param>
/// <returns></returns>
public static int Pow(int a, int n)
{
    if (n == 0)
    {
        return 1;
    }
    return a * Pow(a, --n);
}

4、预制块(库)函数

利用 C# (.NET)预先给定的库,无需编写上述代码。

private void button1_Click(object sender, EventArgs e)
{
    int a = 11;
    int n = 4;
    MessageBox.Show(a + "的" + n + "次幂= " + Math.Pow(a, n), "幂的计算");
}

5、适用性与存在的致命问题

5.1 适用性

(1)上述的程序,将 int 数值类型,修改为 long ,float, double, decimal 均适用;

(2)字符或字符串 char string 不能用哦!

(3)整数 或 浮点数拓展类,比如“复数”、“矩阵”,也可以在相关代码支持下进行“幂” 运算。

请更多知识阅读 深度混淆 的其他文章。

5.2 致命的问题

幂的运算实际上“一点儿也不好玩”。因为常常出错

比如你只需将代码稍作修改:

private void button1_Click(object sender, EventArgs e)
{
    int a = 256;
    int n = 256;
    MessageBox.Show(a + "的" + n + "次幂= " + Pow(a, n), "幂的计算");
}

private void button1_Click(object sender, EventArgs e)
{
    int a = 256;
    int n = 256;
    MessageBox.Show(a + "的" + n + "次幂= " + Math.Pow(a, n), "幂的计算");
}

这些是典型的、无法逃脱的、致命的、数值计算之核心问题:

(1)数值超界!

(2)误差与精度问题!

6、幂的扩展——模幂的计算

模幂(也称为幂模)计算,是数值计算中常用一种算法:

/// <summary>
/// 模幂的快速算法
/// Calculates a^b mod m
/// </summary>
/// <param name="a">a</param>
/// <param name="b">b</param>
/// <param name="m">m</param>
/// <returns>a^b mod m</returns>
public static int power_modulo_fast(int a, int b, int m)
{
    long result = 1;
    long x = a % m;

    for (int i = 1; i <= b; i <<= 1)
    {
        x %= m;
        if ((b & i) != 0)
        {
            result *= x;
            result %= m;
        }
        x *= x;
    }

    return (int)result;
}

private void button1_Click(object sender, EventArgs e)
{
    int a = 251;
    int b = 5;
    int m = 13;
    MessageBox.Show(a + "的" + b + "次模" + m + "幂= " + Power_Module(a, b, m), "模幂的计算");
}

POWER BY 315SOFT.COM315SOFT.COM

猜你喜欢

转载自blog.csdn.net/beijinghorn/article/details/129931298