动手动脑-大数类

前面几讲介绍过JDK所提供的BigInteger能完成大数计算,如果不用它,直接使用数组表达大数,你能实现相同的功能吗?

要求:

(1)用你的大数类实现加和减两个功能

(2)阅读BigInteger类源码,弄清楚它是使用什么算法实现加减乘除四种运算的?

(3)通过互联网查找大数运算的相关资料,给你的大数类添加乘、除、求阶乘等其它功能。

public class Factorial
{
private static final int MAX = 1000000000;
public static final String ENTER = "\n";

public static void main(String args[])
{
int l = 10000;
int[] result = getFacorial(l);
StringBuilder sb = new StringBuilder();
sb.append(result[result.length - 1]);
for (int i = result.length - 2; i >= 0; i--)
{
int n = String.valueOf(result[i]).length();
sb.append(("000000000".substring(n) + result[i]));
}
sb.append(ENTER);
System.out.println("一共" + sb.length() + "位:");
System.out.print(sb.toString());
}

/**
* 递归算阶乘
* @param L
* @return
*/
public static int[] getFacorial(int n)
{
if (n == 1) return new int[]{1};
int[] multiplyToLen = multiplyToLen(getFacorial(n - 1), n);
return multiplyToLen;
}

/**
* 主要算法还是跟BigInteger一样,只不过我为了输出,每个int只保留9位。
* @param value
* @param n
* @return
*/
private static int[] multiplyToLen(int[] value, int n)
{
//n可能大于max,分成两个
long dh = n / MAX;
long dl = n % MAX; //后32位

int xlen = value.length;
//L相当于两个int,可以得出最后的位数最多为 xlen + 2
//可以自己去证明:n位 * m位,结果最多为 n + m位,最少为n + m - 1位
int[] result = (dh == 0L) ? (new int[xlen + 1]) : (new int[xlen + 2]);
long carry = 0;
for (int i = 0; i < xlen; i++)
{
long product = (value[i]) * dl + carry;
result[i] = (int)(product % MAX);
carry = product / MAX;
}
result[xlen] = (int)carry;
//算高位
if (dh != 0L)
{
carry = 0;
for (int i = 0; i < xlen; i++)
{
long product = (value[i]) * dh + result[i + 1] + carry;
result[i] = (int)(product % MAX);
carry = product / MAX;
}
result[result.length - 1] = (int)carry;
}

//carry = 0,证明不需要进最后一位,删除
if (carry == 0L)
result = java.util.Arrays.copyOfRange(result, 0, result.length - 1);
return result;
}
}

时间: 2024-10-27 19:34:42

动手动脑-大数类的相关文章

2018/10/21动手动脑及类的创建

关于类的调用次数,大体使用静态变量来实现. 代码: package yds; import java.util.Scanner; class Number{static int sum;public Number(){ sum++;}int Sum(){ return sum;}}public class duixiangsum { public static void main(String[] args){ Scanner scan=new Scanner(System.in); Numbe

动手动脑(类与对象作业再次提交)

Java字段初始化的规律: 1有实际参数值的,按实际参数值进行初始化例如obj=new Init(300); System.out.println(obj.field); 2没有给出实际参数值时,找默认的构造函数例如Init obj=new Init(); System.out.println(obj.field); 2当多个类之间有继承关系时,创建子类对象导致父类初始化快的执行的程序: package com; class Father { static { System.out.printl

Java课堂动手动脑-截图集锦

课堂实践性问题 没有数据类型,名称与类名相同,没有返回值 类本身有自定义的构造方法,调用时应有参数,这时系统不再使用默认构造方法 类字段初始化顺序 1.执行类成员定义时指定的默认值或累的初始化块,执行哪一个看哪一个排在前面. 2.执行类的构造函数 动手动脑问题(类之间继承,创建子类对象导致父类初始化块的执行) 静态初始化执行顺序 1.静态初始化块只执行一次 2.创建子类的对象时,父类的初始化块也会执行 静态方法访问实例成员变量如下:

动手动脑,无法自拔(2)

1.动手动脑 如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法.而foo类中有一个public foo(int initValue)类,导致系统不能引用默认的构造函数. 2.动手动脑 实例:TextStaticInitialalizeBlock.java: class Root { static{ System.out.println("Root的静态初始化块"); } { System.out.println("Root的普通初始化块"); } p

Java类和对象动手动脑

动手动脑1 以下代码为何无法通过编译?哪儿出错了? 如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法. 动手动脑2 进行试验 使用上页幻灯片中定义的类,以下代码输出结果是什么? public class Test { public static void main(String[] args) { InitializeBlockClass obj=new InitializeBlockClass(); System.out.println(obj.field);//? obj=n

类和对象动手动脑

// 信1705-3 20173574 李胜明 1. 早期经常这样定义变量 int value=100; 前面的示例中这样定义变量 MyClass obj = new MyClass(); 这两种方式定义的变量是一样的吗? 答:这两种方式定义的变量是不一样的,第一种是原始数据类型定义的变量,而第二种是通过引用类名创建一个对象obj出来,obj称为对象变量. 2. 请输入并运行以下代码,得到什么结果?? 代码截图: 3. 以下代码为何无法通过编译?哪儿出错了? package 动手动脑; publ

类和对象,动手动脑

称为类的“构造方法”,有时也习惯称为“构造函数”. 当创建一个对象时,它的构造方法会被自动调用.构造方法与类名相同,没有返回值. 如果类没有定义构造函数,Java编译器在编译时会自动给它提供一个没有参数的“默认构造方法”. 动手动脑 1.以下代码为何无法通过编译?哪儿出错了? 如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法. 如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算? 1.执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排

Java文件与类动手动脑

动手动脑1: 使用Files. walkFileTree()找出指定文件夹下所有大于指定大小(比如1M)的文件. package classJava; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.FileVisitOption; import java.nio.file.FileVisitResult; import java.nio.file.FileVisitor; im

JAVA 数组作业——动手动脑以及课后实验性问题

JAVA课后作业——动手动脑 一:阅读并运行示例PassArray.java,观察并分析程序输出的结果,小结,然后与下页幻灯片所讲的内容进行对照. 1.源代码 // PassArray.java // Passing arrays and individual array elements to methods //引用传递和按值传递 public class PassArray { public static void main(String[] args) { int a[] = { 1,