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