Java 帕斯卡';s三角形故障输出
嗨,我正在用Java制作一个迭代的Pascal三角形。到目前为止,一切都很正常,直到行数超过13行。输出出现故障。我一定是做错了什么,请帮帮我 迭代帕斯卡:Java 帕斯卡';s三角形故障输出,java,arrays,algorithm,pascals-triangle,Java,Arrays,Algorithm,Pascals Triangle,嗨,我正在用Java制作一个迭代的Pascal三角形。到目前为止,一切都很正常,直到行数超过13行。输出出现故障。我一定是做错了什么,请帮帮我 迭代帕斯卡: public class IterativePascal extends ErrorPascal implements Pascal { private int n; IterativePascal(int n) throws Exception { super(n); this.n = n;
public class IterativePascal extends ErrorPascal implements Pascal {
private int n;
IterativePascal(int n) throws Exception {
super(n);
this.n = n;
}
public void printPascal() {
printPascal(false);
}
public void printPascal(boolean upsideDown) {
if (n == 0) { return; }
for (int j = 0; j <= n; j++) {
for (int i = 0; i < j; i++) {
System.out.print(binom(j - 1, i) + (j == i + 1 ? "\n" : " "));
}
}
}
public long binom(int n, int k) {
return (k == 0 || n == k) ? 1 : faculty(n) / (faculty(k) * faculty(n - k));
}
private long faculty(int n) {
if (n == 0 || n == 1) { return 1; }
int result = 1;
for (int i = 2; i <= n; i++) {
result = result * i;
}
return result;
}
}
public类IterativePascal扩展ErrorPascal实现Pascal{
私人int n;
IterativePascal(int n)引发异常{
超级(n);
这个,n=n;
}
public void printPascal(){
printPascal(假);
}
public void printPascal(布尔值向上向下){
如果(n==0){return;}
对于(int j=0;j您达到了数字溢出。因为14!
太大,无法填充javalong
解决方案是使用+
而不是!
将三角形保持为二维数组,并对其进行迭代。每个单元格应该是两个“以上”的和
+---+---+---+---+
| 1 | | | |
| 1 | 1 | | |
| 1 | 2 | 1 | |
| 1 | 3 | 3 | 1 |
+---+---+---+---+
代码如下:
public static void triangle(int n) {
int[][] triangle = new int[n];
for (int i = 0; i < n; i++) {
triangle[i] = new int[i+1];
}
triangle[0][0] = 1;
triangle[1][0] = 1;
triangle[1][1] = 1;
for (int i = 2; i < n; i++) {
triangle[i][0] = 1;
for (int j = 1; j < triangle[i].length - 1; j++) {
triangle[i][j] = triangle[i-1][j] + triangle[i-1][j+1];
}
triangle[i][triangle[i].length-1] = 1;
}
printArray(triangle);
}
问题可能出在阶乘的计算中:我假设int类型最多可以容纳32位的数字,但13!大于32位
您可以检查long是否可以存储更大的数字并将结果定义为long。我有一个递归方法,其中也包含long binom,效果很好。我真的需要坚持使用我的原始代码。感谢您的帮助。如果您想使用binom,只需从long切换到biginger
s。记住,您可以更精确地计算binom有效。我的意思是,你不应该执行任何除法。与其计算n!/(k!(n-k)!
calculaten*(n-1)*……*(k+1)/(n-k)!
。还比你的代码好。我相信真正的爱因斯坦不会称之为“能力”:-)你或你的拼写纠正软件正在寻找的词是“阶乘”。当已存在一个优秀的已接受答案时,请在回答之前尝试确保您有新信息(此答案当前在低质量队列中)也许你在写之前应该真正确定哪个答案是第一个答案。你是对的,对不起,我没有注意到另一个答案也是最近的。新用户回答老问题是很常见的。好吧。不过,你的评论既没有帮助,也不友好,因此毫无用处。
public static void triangle(int n) {
int[][] triangle = new int[n];
for (int i = 0; i < n; i++) {
triangle[i] = new int[i+1];
}
triangle[0][0] = 1;
triangle[1][0] = 1;
triangle[1][1] = 1;
for (int i = 2; i < n; i++) {
triangle[i][0] = 1;
for (int j = 1; j < triangle[i].length - 1; j++) {
triangle[i][j] = triangle[i-1][j] + triangle[i-1][j+1];
}
triangle[i][triangle[i].length-1] = 1;
}
printArray(triangle);
}
public BigInteger binom(int n, int k) {
return (k == 0 || n == k) ? BigInteger.ONE : faculty(n).divide((faculty(k).multiple(faculty(n - k)));
}
private BigInteger faculty(int n) {
BigInteger result = BigInteger.ONE;
while (!n.equals(BigInteger.ZERO)) {
result = result.multiply(n);
n = n.subtract(BigInteger.ONE);
}
return result;
}
public void printPascal(boolean upsideDown) {
if (n == 0) { return; }
for (int j = 0; j <= n; j++) {
for (int i = 0; i < j; i++) {
System.out.print(binom(j - 1, i).toString() + (j == i + 1 ? "\n" : " "));
}
}
}