`
xlaohe1
  • 浏览: 128558 次
  • 性别: Icon_minigender_1
  • 来自: 来处
社区版块
存档分类
最新评论

大数相乘,次方,X的Y次方

    博客分类:
  • java
阅读更多
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);
	}
}

1
0
分享到:
评论

相关推荐

    大数相乘,x^y的实现

    大数相乘与x的y次方实现 大数相乘是指在计算机科学中对大整数的乘法运算。由于计算机无法直接存储大整数,因此需要使用字符数组或链表来实现大整数的存储和运算。在本文中,我们将介绍大数相乘的算法和实现。 在...

    大数的n次方

    例如,如果要求计算x的n次方,我们可以先计算x*x,再对结果求n/2次方,直到n变为1。这种方法称为“平方再乘”(Square-and-Multiply)算法,其时间复杂度为O(logn)。 在实际编程中,C++标准库提供了`...

    1-高次方数的尾数.rar_GT1_kind7i7_高次方尾数_高次方数比较_高次方比较

    这是因为这些尾数可以揭示某些乘法运算的规律,特别是当处理大数相乘时,能显著提高计算效率。 描述中提到的算法是基于这样一个观察:计算一个数的N次方的最后三位数字,只需要关注该数及其指数的最后三位。这是...

    n的二次方大数运算 acm应该会用到

    - **读取输入**:用户输入两个正整数`x`和`y`,其中`y`代表要进行`x`的`y`次幂运算。 - **计算过程**: - 遍历每一位进行乘法运算,并将结果存储回数组`num[]`中。 - 使用进位机制来处理多位数相乘时产生的进位...

    计算4的10000次方(C#)

    在C#中,计算4的10000次方这样的大数涉及到多个知识点,包括大数表示、数学算法以及C#语言特性。本文将详细讲解这些关键点。 首先,C#标准库提供了一个名为`System.Numerics.BigInteger`的数据类型,专门用于存储和...

    大数阶乘 双向链表

    3. **乘法算法**:我们需要设计一个算法来实现两个链表表示的大数相乘。可以采用类似于笔算乘法的方法,但需要考虑到链表的特性。这个算法可以分为以下几个步骤: - 分别遍历两个链表,记录当前遍历到的位数。 - ...

    C++ STL算法实现大数计算

    C++ STL算法实现大数计算 本文将详细介绍C++ STL算法实现大数计算的知识点,包括大数计算的原理、C++ STL容器的...此外,我们还学习了如何使用vector容器来存储大数,以及如何使用按位相乘和处理进位来实现大数计算。

    易语言大数幂模运算

    2. **大数乘法**:实现两个大数相乘的算法,如Karatsuba算法或Toom-Cook算法,这些算法比简单的乘法规则更高效。 3. **大数平方**:优化的大数乘方操作,通常用于快速幂算法中,用于计算a的2的n次方。 4. **快速幂...

    JS100000大数乘方计算.rar

    快速幂算法是基于分治策略,将大数`a`的`n`次方通过不断平方和乘法快速计算出来。基本步骤是:如果`n`是偶数,那么`a^n = (a^2)^(n/2)`;如果是奇数,`a^n = a * (a^(n-1))`。通过递归或迭代方式执行,时间复杂度可...

    大数阶乘(vb.net)

    * 1,可以将相邻的两个数相乘,然后用对数公式2^(k-1)来减少乘法操作,如n * (n-1) = n^2 - n = (2 * n - 1)^1,这在大数计算中能显著减少计算量。 4. **错误处理**:在实际编程中,需要考虑输入边界条件,如n是否...

    C++实现的大数运算工具 v1.1

    快速幂算法(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为一个足够大...

    汇编2次方的科学运算源码

    平方一个数可以视为一个数与自身相乘,所以只需两次乘法操作即可完成。 科学运算往往涉及复杂数学,比如对大数的处理、浮点运算和复数运算等。在汇编中,这些运算可能需要更复杂的算法和数据结构来实现。例如,对于...

    大数计算器(支持大素数判定)

    例如,两个非常大的质数相乘可能会生成一个巨大的密钥,这是加密算法(如RSA)的基础。这些运算需要高效的算法,比如Karatsuba算法或Toom-Cook算法,以减少计算时间。 快速A^B%C运算,也就是快速幂取模,是一种优化...

    java练习_大数运算_BigInteger.pdf

    例如,我们使用 `multiply()` 方法来计算 91 的 92 次方,然后使用 `remainder()` 方法来计算它除以 100 的余数。 在了解了 BigInteger 类的方法调用之后,我们可以更好地使用它来实现大数运算。例如,我们可以使用...

    模重复平方运算 编程练习

    在每次迭代中,`y`被自身平方,如果`z`的最右边的位为1,那么`y`会与`x`相乘。最后,`z`也向右移一位,直到所有的二进制位都被处理。返回的结果`y`就是`x`的`n`次方。 在`main`函数中,程序读取三个整数`b`、`n`和`...

    用VBS精确计算2的100次方的代码

    函数接受两个参数`x`和`y`,分别代表要相乘的数。它首先确定每个数字的长度,然后分配一个数组`w`来存储中间结果。接下来,通过两层嵌套循环逐位相乘,对每一位进行计算,包括进位操作。最后,将结果字符串反转,...

    C++大数模板(推荐)

    求幂运算符`operator^`接受一个整数,返回大数的n次方;取模运算符`operator%`接受一个整数,返回大数除以该整数的余数。 大数的比较运算通过重载大于运算符`operator&gt;`实现,可以比较两个大数或者大数与整数的大小...

    科学计数法七年级数学PPT学习教案.pptx

    总结一下,科学计数法是将大数和小数转化为易于处理的形式,通过一个1到10之间的数a与10的n次幂相乘,其中n是表示10的幂的零的个数。这种表示方法在数学、科学、工程等领域有着广泛的应用,有助于简化数值的表达和...

Global site tag (gtag.js) - Google Analytics