相关疑难解决方法(0)

当使用整数计算Java的阶乘100(100!)时,我得到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)

这显然是因为结果对于整数来说太大了,但我习惯于为溢出得到大的负数,而不是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)

我得到这个.

java int overflow factorial

15
推荐指数
4
解决办法
2万
查看次数

(a*b)/ c MulDiv并处理中间乘法的溢出

我需要做以下算术:

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_VALUELong.MAX_VALUE减少)运行的时间(超过2倍)比较的BigInteger(即〜18%相比,我的适应BigInteger的算法中) .

优化和测试会有更多的迭代,但在这一点上,我认为我必须接受这个答案是最好的.

java algorithm division long-integer

8
推荐指数
1
解决办法
345
查看次数

如何在Java中将非常大的十进制数转换为二进制数

例如,我如何能够转换2^6012345678901234567890123456789012345678901234567890二进制?基本上,数字太大而无法用Java表示.

编辑:我将创建一个能够代表太大的数字的类.我只是很难确定如何将十进制转换为二进制.

Edit2:而且,我不允许使用BigDecimal,BigInteger或任何其他库,抱歉没有提前指定.

java binary decimal

5
推荐指数
2
解决办法
1万
查看次数

从头开始实现BigInteger的乘法(并确保它是O(n ^ 2))

作为家庭作业,我正在实施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)

java bytearray biginteger

5
推荐指数
1
解决办法
2978
查看次数

如何在java中生成0到2 ^ 32-1之间的随机数

如何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)

我不知道为什么..

java random unsigned

4
推荐指数
1
解决办法
3379
查看次数

如何在 C# 中不使用 bigint 来添加或减去非常大的数字?

首先我要说的是,我是一个新手,对 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)

c# bigint

4
推荐指数
1
解决办法
1万
查看次数

添加两个非常大的数字

可能重复:
如何在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)

java

0
推荐指数
1
解决办法
3136
查看次数

如何在Java中将非常大的String转换为数字

嗨,我有一个像这样的大字符串:

"999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"

我希望将此字符串转换为long.但我失败了.我做了:

Long.parseLong(longString);
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

java.lang.NumberFormatException: For input string: "99999999.......
Run Code Online (Sandbox Code Playgroud)

有什么方法可以避免这种情况吗?

java string numbers

0
推荐指数
1
解决办法
4970
查看次数

因子计算

我正在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)

java

-3
推荐指数
1
解决办法
203
查看次数