大数n次方算法笔记

问题是解决 A^n 的问题。
最简单的想法是使用循环:
long result = 1;

for (i = 1; i <= n; i++)
{
    result = result * A;
}

return result;

但是,如果A与n足够大,就有可能在循环的某一步时得到过大的result,
超出现有变量保存范围。
所以,需要有其他方法对应A^n 的问题。

具体算法李老师的文章已经给出了。
http://student.csdn.net/space.php?uid=124362&do=blog&id=38231

本人自己的思路是:
1.  求解问题的关键是解决循环的某一步, result 特别大时,
    result = result * A; 的计算问题,如果这一问题解决,
    整个问题就迎刃而解了。
2.  设result一共有x位,A一共有y位。
    设result各位的值为:r1,r2,...rx;A各位的值为:a1,a2,...,ay。
    则result * A = [rx * 10^(x - 1) + ...+ r2 * 10^(2 - 1) + r1 * 10^(1 - 1) ]
                 * [ay * 10^(y - 1) + ...+ a2 * 10^(2 - 1) + a1 * 10^(1 - 1) ]
    然后呢?处理好各项之间的乘积,注意每项所属位数,
    如 ri * 10^(i - 1) * aj * 10^(j - 1) ,为result的第i位与A的第j位的乘积,
    乘积的有效值为 (ri * aj),(ri * aj)这个值应该属于最终结果 result * A的第 (i + j - 1)位。
    当然,还要注意,如果(ri * aj) 的结果大于9,则应进位。
    如,(ri * aj) = 27,则第 (i + j - 1)位应为7, 并向第(i + j)位进2。
    到此,其实问题已经解决。
3.  下面举个例子(为了简单,取了很简单的数)
    设result = 1234, A = 123
    将1,2,3,4分别乘以1,2,3,并注意乘积的位数,得到:
    1 * 1 = 1 第 4 + 3 - 1 = 6 位。
    1 * 2 = 2 第 4 + 2 - 1 = 5 位。
    1 * 3 = 3 第 4 + 1 - 1 = 4 位。
    2 * 1 = 2 第 3 + 3 - 1 = 5 位。
    2 * 2 = 4 第 3 + 2 - 1 = 4 位。
    2 * 3 = 6 第 3 + 1 - 1 = 3 位。
    3 * 1 = 3 第 2 + 3 - 1 = 4 位。
    3 * 2 = 6 第 2 + 2 - 1 = 3 位。
    3 * 3 = 9 第 2 + 1 - 1 = 2 位。
    4 * 1 = 4 第 1 + 3 - 1 = 3 位。
    4 * 2 = 8 第 1 + 2 - 1 = 2 位。
    4 * 3 = 12 第 1 + 1 - 1 = 1 位。
    此时,结果的第1位只有一个解:12,但是12 > 9,所以第1位为2,并向第2位进位1。
    第2位有2个解:8,9,并考虑第1位的进位,得,第2位 = 8 + 9 + 1 = 18,保留8,并向第3位进位1。
    第3位有3个解:4,6,6, 并考虑第2位的进位,得,第3位 = 4 + 6 + 6 + 1 = 17,保留7,并向第4位进位1。
    第4位有3个解:3,4,3, 并考虑第3位的进位,得,第4位 = 3 + 4 + 3 + 1 = 11,保留1,并向第5位进位1。
    第5位有2个解:2,2, 并考虑第4位的进位,得,第5位 = 2 + 2 + 1 = 5,保留5,无进位。
    第6位有1个解:1,保留1,无进位。
    所以,最终结果为:151782 = 1234 * 123

### 回答1: 大数计算在计算机科学中是一种用于处理非常大的数值的技术。当需要计算一个数的非常高次方时,通常使用大数计算技术。 假设需要计算一个数a的n次方(n是一个非常大的数),可以使用分治算法。将n拆分成多个部分,每次计算一部分的结果,最终将结果合并在一起得到最终的结果。 例如,如果需要计算a的100次方,可以将100拆分成50+50,然后计算a的50次方的平方,再将结果平方得到a的100次方的结果。 在使用大数计算时,需要注意精度问题和溢出问题。可以使用高精度计算库或自己实现高精度算法来处理这些问题。 因此,想要计算一个数的n次方,可以使用大数计算技术,并将n拆分成多个部分来计算,避免精度和溢出问题。 ### 回答2: 大数计算 a 的 n 次方,要先理解大数的概念。在计算机中,一般规定,整数的范围是有限的,通常是在-2的31次方到2的31次方-1之间,如果一个数出这个范围,就称之为大数。 要计算大数的n次方,一般常用两种方法: 一、普通乘法 普通乘法的方法是把a累乘n次,即a乘以a,再乘以a,直到乘n次为止。这种方法简单易懂,但是会出现一个非常严重的问题,就是数值溢出。如果a比较大,计算机压根就计算不了那么大的数,所以这种方法并不适合计算大数的n次方。 二、快速幂算法 快速幂算法是解决大数计算n次方的最常用方法。算法的核心思想是采用分治策略,把指数n不断拆分成可以计算的小指数,并利用数学规律对这些指数进行计算。具体过程如下: 1. 将指数n写成二进制数的形式:n=n0×2^0+n1×2^1+n2×2^2+...+nk×2^k。 2. 把底数a循环自乘,每次循环按照2的幂次来乘,每乘一次指数就除以2。 3. 如果某一位指数是1,就把对应的底数的值乘入结果中。 4. 重复2、3步,直到指数n变成0。 采用快速幂算法计算大数的n次方,计算量只和指数的位数相关,而与指数的大小无关。因此对于大数的n次方运算,快速幂算法是一种非常高效的计算方法,而且可以避免出现数值溢出的问题。 ### 回答3: 大数计算指的是对于过计算机所能表示的范围的数字,采用特殊算法进行计算。而a的n次方则是将a自乘n次得到的结果,如果直接使用计算机运算,则当n较大时,计算机可能难以处理,因此需要使用大数计算算法大数计算算法主要有两种,一种是高精度计算,另一种是快速幂算法。 高精度计算是将大数拆分为多个小数进行计算,在每个小数上实现对应位上数字的运算,最终将计算结果合并得到大数的结果。这种算法比较适合对于大数的加减乘除等基本运算和初等函数的计算,但是计算复杂度较高,需要耗费大量的时间和计算机资源。 快速幂算法则是采用递归算法实现幂运算的计算,与传统的幂运算不同的是,快速幂算法只需要进行log(n)次乘法运算即可完成a的n次方的计算。这种算法的优势在于计算速度快,但是需要注意的是,其递归层数可能会比较深,因此在实际应用时需要进行优化和实现。 在实际应用中,需要根据具体情况选择不同的算法进行计算,例如对于较短的数字可以使用高精度计算算法,而对于较长的数字则可以选择快速幂算法进行计算。在实现算法时,需要特别注意数据类型的选择和运算符的使用,避免由于数据溢出或精度问题导致计算结果不准确的情况出现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值