package com.luoyh.gram;
import java.math.BigInteger;
public class Program005 {
//如何求919的230次方?
public static void main(String[] args) {
//3652309885822188847156289172384812657813091020334632766118353221968146408065431953413226496752584529397107234066579567598901542744375869645822596223408199506319443774384955374065650217156614442984807614315760059451457689078438582959976943724202574123383020597107659309089090474641361928303566529583439123520587517644476193675997378768727047531780293350975631065789714975421669066227322639816687426611300838818559671973514750497935791414555528625455885997463225263669876781079601430278062359662278314276970690912086194326127239857799763118635568381269828287560680427424163886926617693838337423787844655026719803501949002238962256268054128761071850464006991147941247244049176438852401
//3652309885822188847156289172384812657813091020334632766118353221968146408065431953413226496752584529397107234066579567598901542744375869645822596223408199506319443774384955374065650217156614442984807614315760059451457689078438582959976943724202574123383020597107659309089090474641361928303566529583439123520587517644476193675997378768727047531780293350975631065789714975421669066227322639816687426611300838818559671973514750497935791414555528625455885997463225263669876781079601430278062359662278314276970690912086194326127239857799763118635568381269828287560680427424163886926617693838337423787844655026719803501949002238962256268054128761071850464006991147941247244049176438852401
BigInteger b2 = new BigInteger("919");
BigInteger bb = b2.pow(230);
System.out.println(bb);
System.out.println(pow("919", "919", 230));
System.out.println((pow("919", "919", 230)).equals(bb.toString()));
}
/**
* 求num2的len次方
* 注意,调用次方方法,num1必须等于num2
* @author luoyh
*
* @param num1
* @param num2
* @param len 多少次方
* @return 结果字符串
*/
public static String pow(String num1, String num2, int len) {
if(len <= 1)
return num1;
len --;
return pow(mul(num1, num2), num2, len);
}
/**
* 把数组倒序转换字符串,并去掉转换后的首位为0
* @author luoyh
*
* @param arr 要转换的数组
* @return 倒序并去0的字符串
*/
public static String cc(int arr[]) {
String info = "";
int len = arr.length - 1;
while(true) {
if(len < 0)
break;
info += arr[len];
len --;
}
while(true) {//去掉首位字符0
if(info.length() == 1 && info.equals("0")) // 如果为0就结束
break;
if(info.charAt(0) == '0')
info = info.substring(1);
else
break;
}
return info;
}
/**
* 2个大数相乘
* @author luoyh
*
* @param num1 数值1
* @param num2 数值2
* @return 返回num1 * num2 的字符串
*/
public static String mul(String num1, String num2) {
boolean isMax = num1.length() >= num2.length();
int len1 = num1.length() - 1;
int len2 = num2.length() - 1;
int arr1[] = new int[num1.length()];
int arr2[] = new int[num2.length()];
int arr[] = new int[isMax ? arr1.length * 2 : arr2.length * 2];
int index = 0;
while(true) {
if(len1 < 0)
break;
arr1[index] = num1.charAt(len1) - '0';
len1 --;
index ++;
}
index = 0;
while(true) {
if(len2 < 0)
break;
arr2[index] = num2.charAt(len2) - '0';
len2 --;
index ++;
}
for(int i = 0; i < arr1.length; i ++) {
for(int j = 0; j < arr2.length; j ++) {
//example: 1234 * 123 最开始arr=[0,0,0,0,0,0,0,0];
//首先拿4 * 1 | 2 | 3 , 放到arr的0,1,2索引处 [12,8,4,0,0,0,0,0]
//然后拿3 * 1 | 2 | 3 , 放到arr的1,2,3索引处 [12,8+9,4+6,0+3,0,0,0,0]
//...
// 最后得到 arr = [12,17,16,10,4,1,0,0];
arr[j + i] += arr1[i] * arr2[j];
}
}
for(int i = 0 ; i < arr.length; i ++) {
if(arr[i] > 9) {
// arr = [12,17,16,10,4,1,0,0];
// 首先得设置下一个数的值等于原值加上这个值进位的数值
// 比如 [12,17,...],设置后为[2,17+(12/10=1)=18,...],
// [1234,321,...] --> [1234%10=4, 321+(1234/10=123)=444,...]
arr[i + 1] = arr[i + 1] + arr[i] / 10;
arr[i] = arr[i] % 10;
}
}
return cc(arr);
}
}
分享到:
相关推荐
大数相乘与x的y次方实现 大数相乘是指在计算机科学中对大整数的乘法运算。由于计算机无法直接存储大整数,因此需要使用字符数组或链表来实现大整数的存储和运算。在本文中,我们将介绍大数相乘的算法和实现。 在...
例如,如果要求计算x的n次方,我们可以先计算x*x,再对结果求n/2次方,直到n变为1。这种方法称为“平方再乘”(Square-and-Multiply)算法,其时间复杂度为O(logn)。 在实际编程中,C++标准库提供了`...
这是因为这些尾数可以揭示某些乘法运算的规律,特别是当处理大数相乘时,能显著提高计算效率。 描述中提到的算法是基于这样一个观察:计算一个数的N次方的最后三位数字,只需要关注该数及其指数的最后三位。这是...
- **读取输入**:用户输入两个正整数`x`和`y`,其中`y`代表要进行`x`的`y`次幂运算。 - **计算过程**: - 遍历每一位进行乘法运算,并将结果存储回数组`num[]`中。 - 使用进位机制来处理多位数相乘时产生的进位...
在C#中,计算4的10000次方这样的大数涉及到多个知识点,包括大数表示、数学算法以及C#语言特性。本文将详细讲解这些关键点。 首先,C#标准库提供了一个名为`System.Numerics.BigInteger`的数据类型,专门用于存储和...
3. **乘法算法**:我们需要设计一个算法来实现两个链表表示的大数相乘。可以采用类似于笔算乘法的方法,但需要考虑到链表的特性。这个算法可以分为以下几个步骤: - 分别遍历两个链表,记录当前遍历到的位数。 - ...
C++ STL算法实现大数计算 本文将详细介绍C++ STL算法实现大数计算的知识点,包括大数计算的原理、C++ STL容器的...此外,我们还学习了如何使用vector容器来存储大数,以及如何使用按位相乘和处理进位来实现大数计算。
2. **大数乘法**:实现两个大数相乘的算法,如Karatsuba算法或Toom-Cook算法,这些算法比简单的乘法规则更高效。 3. **大数平方**:优化的大数乘方操作,通常用于快速幂算法中,用于计算a的2的n次方。 4. **快速幂...
快速幂算法是基于分治策略,将大数`a`的`n`次方通过不断平方和乘法快速计算出来。基本步骤是:如果`n`是偶数,那么`a^n = (a^2)^(n/2)`;如果是奇数,`a^n = a * (a^(n-1))`。通过递归或迭代方式执行,时间复杂度可...
* 1,可以将相邻的两个数相乘,然后用对数公式2^(k-1)来减少乘法操作,如n * (n-1) = n^2 - n = (2 * n - 1)^1,这在大数计算中能显著减少计算量。 4. **错误处理**:在实际编程中,需要考虑输入边界条件,如n是否...
快速幂算法(Fast Exponentiation)可以显著减少计算次数,通过不断地平方和乘法操作,将指数b转换为二进制形式,每次只计算a的2的幂次方次方。 7. **头文件`BigIntegerTools.h`**:可能包含了大数类的声明,包括...
- `string IntMult(string x, string y)`:这是实现分治法大整数乘法的核心函数。 - 首先去除字符串前导的零。 - 确保两个字符串长度相同或接近,通过在较短的字符串前面补零来实现。 - 根据字符串长度选择合适...
- 如果位值为1,就将a自乘然后与结果res相乘,并对模数c取模,即res = (res * res) % c。 - 然后将a自乘,即a = a * a % c。 4. 最终,res就是a的b次方对c取模的结果。 在实现大数阶乘时,我们选择c为一个足够大...
平方一个数可以视为一个数与自身相乘,所以只需两次乘法操作即可完成。 科学运算往往涉及复杂数学,比如对大数的处理、浮点运算和复数运算等。在汇编中,这些运算可能需要更复杂的算法和数据结构来实现。例如,对于...
例如,两个非常大的质数相乘可能会生成一个巨大的密钥,这是加密算法(如RSA)的基础。这些运算需要高效的算法,比如Karatsuba算法或Toom-Cook算法,以减少计算时间。 快速A^B%C运算,也就是快速幂取模,是一种优化...
例如,我们使用 `multiply()` 方法来计算 91 的 92 次方,然后使用 `remainder()` 方法来计算它除以 100 的余数。 在了解了 BigInteger 类的方法调用之后,我们可以更好地使用它来实现大数运算。例如,我们可以使用...
在每次迭代中,`y`被自身平方,如果`z`的最右边的位为1,那么`y`会与`x`相乘。最后,`z`也向右移一位,直到所有的二进制位都被处理。返回的结果`y`就是`x`的`n`次方。 在`main`函数中,程序读取三个整数`b`、`n`和`...
函数接受两个参数`x`和`y`,分别代表要相乘的数。它首先确定每个数字的长度,然后分配一个数组`w`来存储中间结果。接下来,通过两层嵌套循环逐位相乘,对每一位进行计算,包括进位操作。最后,将结果字符串反转,...
求幂运算符`operator^`接受一个整数,返回大数的n次方;取模运算符`operator%`接受一个整数,返回大数除以该整数的余数。 大数的比较运算通过重载大于运算符`operator>`实现,可以比较两个大数或者大数与整数的大小...
总结一下,科学计数法是将大数和小数转化为易于处理的形式,通过一个1到10之间的数a与10的n次幂相乘,其中n是表示10的幂的零的个数。这种表示方法在数学、科学、工程等领域有着广泛的应用,有助于简化数值的表达和...