这样做时:
int x = 100;
int result = 1;
for (int i = 1; i < (x + 1); i++) {
result = (result * i);
}
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)
这显然是因为结果对于整数来说太大了,但我习惯于为溢出得到大的负数,而不是0.
提前致谢!
当我切换到这个:
int x = 100;
int result = 1;
for (int i = 1; i < (x + 1); i++) {
result = (result * i);
System.out.println(result);
}
Run Code Online (Sandbox Code Playgroud)
我得到这个.
我需要做以下算术:
long a,b,c;
long result = a*b/c;
Run Code Online (Sandbox Code Playgroud)
虽然结果保证适合long,但乘法不是,所以它可以溢出.
我试图一步一步地进行(首先乘法再划分),同时通过将中间结果拆分a*b为最大4的大小的int数组来处理溢出(就像BigInteger使用其int[] mag变量一样).
在这里,我被这个部门困住了.我无法理解进行精确划分所需的按位变换.我需要的只是商(不需要余数).
假设的方法是:
public static long divide(int[] dividend, long divisor)
Run Code Online (Sandbox Code Playgroud)
此外,我不考虑使用,BigInteger因为代码的这部分需要快速(我想坚持使用原语和原始数组).
任何帮助将非常感激!
编辑:我不是要BigInteger自己实现整个.我想要做的是比使用泛型更快地解决特定问题(a*b/c哪里a*b可以溢出)BigInteger.
编辑2:如果它可以以一种聪明的方式完成,完全没有溢出,注释中出现了一些提示,那将是理想的,但我仍在寻找一个正确的方法.
更新: 我尝试将BigInteger代码移植到我的特定需求,没有创建对象,并且在第一次迭代中,与使用BigInteger(在我的开发PC上)相比,我的速度提高了约46%.
然后我尝试了一下修改@大卫Eisenstat的解决方案,这给了我〜56%(我跑100_000_000_000随机输入来自Long.MIN_VALUE于Long.MAX_VALUE减少)运行的时间(超过2倍)比较的BigInteger(即〜18%相比,我的适应BigInteger的算法中) .
优化和测试会有更多的迭代,但在这一点上,我认为我必须接受这个答案是最好的.
例如,我如何能够转换2^60或12345678901234567890123456789012345678901234567890二进制?基本上,数字太大而无法用Java表示.
编辑:我将创建一个能够代表太大的数字的类.我只是很难确定如何将十进制转换为二进制.
Edit2:而且,我不允许使用BigDecimal,BigInteger或任何其他库,抱歉没有提前指定.
作为家庭作业,我正在实施Karatsuba的算法,并针对大整数的小学式O(n ^ 2)乘法算法进行基准测试.
我猜这里我唯一的选择是将数字带到它们的字节数组表示中,然后从那里开始工作.
好吧,我被困在这里...当使用*运算符时,我不知道如果数字溢出一个字节乘法或添加一个进位,我将如何检测/纠正.有任何想法吗?
public static BigInteger simpleMultiply(BigInteger x, BigInteger y){
//BigInteger result = x.multiply(y);
byte [] xByteArray = x.toByteArray();
byte [] yByteArray = y.toByteArray();
int resultSize = xByteArray.length*yByteArray.length;
byte [][] rowsAndColumns = new byte[resultSize][resultSize];
for (int i =0; i<xByteArray.length;i++)
for (int j=0; j<yByteArray.length;j++){
rowsAndColumns[i][j] = (byte )(xByteArray[i] * yByteArray[j]);
// how would I detect/handle carry or overflow here?
}
return null;
}
Run Code Online (Sandbox Code Playgroud) 如何between 0 and 2^32-1在java中生成随机数?我写这个链接:
long[]num = new long[size + 1];
Random random = new Random();
for (int i = 1; i < size + 1; i++) {
num[i] = (long)random.nextInt()+(long)(1<<31);
System.out.println(num[i]);
}
Run Code Online (Sandbox Code Playgroud)
但它打印
-1161730240
-1387884711
-3808952878
-3048911995
-2135413666
Run Code Online (Sandbox Code Playgroud)
我不知道为什么..
首先我要说的是,我是一个新手,对 C# 的了解很少。
回到主题:我需要制作一个能够对非常大的整数进行加/减的程序。最初,使用 BigInt 只是发现它是不允许的。应该有一个合乎逻辑的解决方法吗?我有一个想法,使用“小学方法”,从右到左添加每个数字。
我制作了一个字符串,将其拆分为 char 数组,并从右到左添加每个数字(GetUpperBound-i)。但这似乎不起作用。
我的代码:
string s, s2;
char[] c_arr, c_arr2;
int i, erg;
s = "1234";
s2 = "5678";
c_arr = s.ToCharArray();
c_arr2 = s2.ToCharArray();
for (i = 0; i <= c_arr.GetUpperBound(0); i++)
{
erg = c_arr[c_arr.GetUpperBound(0)-i]+c_arr2[c_arr2.GetUpperBound(0)-i];
Console.Write(erg);
}
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud) 可能重复:
如何在java中添加任意长度的两个数字?
谁能帮我这个?
我需要做的是添加一个计算器不能容纳的非常大的数字.
这是我的代码虽然它只能持有一个数字,直到2147483647 ..任何数字高于我得到错误消息说明"整数太大"
任何人都可以告诉我如何使用更大的数字?
import java.math.BigDecimal;
public class AddTwoBigNumbers{
public static void main() {
BigDecimal num1, num2;
num1 = new BigDecimal(2147483647);
num2 = new BigDecimal(2147483647);
Sum(num1, num2);
}
public static void Sum(BigDecimal val1, BigDecimal val2){
BigDecimal sum = val1.add(val2);
System.out.println("Sum of two BigDecimal numbers: "+ sum);
}
}
Run Code Online (Sandbox Code Playgroud) 嗨,我有一个像这样的大字符串:
"999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
我希望将此字符串转换为long.但我失败了.我做了:
Long.parseLong(longString);
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误:
java.lang.NumberFormatException: For input string: "99999999.......
Run Code Online (Sandbox Code Playgroud)
有什么方法可以避免这种情况吗?
我正在Saylor学院的网页上通过计算机科学学习java编程.我到了学习NetBeans中调试程序的地方,并且有一个计算和打印阶乘的程序n (=1*2*3*...*n).该文中说程序中存在逻辑错误,但没有关于它的位置.我似乎无法弄清楚逻辑错误在哪里.
有谁可以提供帮助?程序代码:
/** Compute the factorial of n */
public class Factorial {
// Print factorial of n
public static void main(String[] args) {
int n = 20;
int factorial = 1;
// n! = 1*2*3...*n
for (int i = 1; i <= n; i++) {
factorial *= i;
}
System.out.println("The Factorial of " + n + " is " + factorial);
}
}
Run Code Online (Sandbox Code Playgroud)