- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
public BCD multiplyBCDs(BCD other) {
BCD thisBCD = new BCD(digit);
BCD newBCD = new BCD(0);
int DIGIT = 0;
do {
newBCD = newBCD.addBCDs(other.multiplyBy(thisBCD.nthDigit(DIGIT)));
other = other.multiplyByTen();
DIGIT++;
} while (DIGIT < thisBCD.numberOfDigits());
return newBCD;
}
程序的其余部分对于解决我的问题来说不应该太重要,但如果是的话,我会将其其余部分发布在底部。每个 BCD 基本上都是存储在数组中的整数。 thisBCD 等于 222,BCD other 也等于 222。我的目标是将这两个 BCD 相乘。
nthDigit 与 thisBCD[DIGIT] 基本相同,返回数字的某位。
MultiplyBy 将 BCD 乘以给定的整数。
MultiplyByTen 乘以 10。(废话)
addBCDs 将 2 个 BCD 加在一起。
我的问题是,该方法返回 1332 (222 * (2 + 2 + 2),而不是 49,284 ((222 * 2) + (222 * 20) + (222 * 200)。
如果您需要的话,这是我的程序和驱动程序的其余部分:
public class BCD {
private int[] digit;
// constructor (creates array from another array)
public BCD(int bcdDigits[]) {
digit = new int[bcdDigits.length];
for (int i = 0; i < digit.length; i++) {
digit[i] = bcdDigits[i];
}
}
// constructor (creates array from an int)
public BCD(int num) {
digit = new int[1];
int DIGIT = num % 10;
digit[0] = DIGIT;
num /= 10;
while (num > 0) {
DIGIT = num % 10;
addADigit(DIGIT);
num /= 10;
}
}
// returns number of digits in bcd
public int numberOfDigits() {
int length = digit.length;
return length;
}
// returns the value of a certain digit in the BCD
public int nthDigit(int n) {
System.out.println("N: " + n);
if (n >= digit.length || n < 0) {
return -1;
} else {
return digit[digit.length - 1 - n];
}
}
// prints the BCD backwards (printing the original number being stored in
// the array)
public void print() {
for (int i = digit.length - 1; i >= 0; i--) {
System.out.print(digit[i]);
if (i % 3 == 0 && i != 0) {
System.out.print(",");
}
}
}
// adds a digit to the BCD
public void addADigit(int newdigit) {
int[] a = new int[digit.length + 1];
for (int i = 0; i < digit.length; i++) {
a[i] = digit[i];
}
a[a.length - 1] = newdigit;
digit = a;
}
public BCD addBCDs(BCD other) {
BCD newBCD = null;
int length;
if (other.numberOfDigits() > digit.length) {
length = other.numberOfDigits();
} else {
length = digit.length;
}
int count = 0;
int temp = 0;
int carry = 0;
while (count < length + 1) {
temp = 0;
// Adds the value of digit[count] to temp, assuming that there is a
// number available there.
if (count <= digit.length - 1) {
temp += digit[count];
}
// Adds the value of other.nthDigit(count) to temp, assuming that
// there is a number available there.
if (count <= (other.numberOfDigits()) - 1) {
temp += other.nthDigit(count);
}
// either adds temp as the first digit of the newBCD, or adds temp %
// 10, and sets up a carry. This section is for the first digit
// only.
if (count == 0 && temp < 10) {
newBCD = new BCD(temp);
} else if (count == 0 && temp >= 10) {
newBCD = new BCD(temp % 10);
carry++;
}
// either adds temp as the next digit of the newBCD, or adds temp %
// 10, and sets up a carry. This section works for all digits
// excluding the first.
if (count > 0 && temp + carry < 10 && count < length) {
newBCD.addADigit(temp + carry);
carry = 0;
} else if (count > 0 && temp + carry < 10 && count == length && temp + carry != 0) {
newBCD.addADigit(temp + carry);
carry = 0;
} else if (temp + carry >= 10 && count > 0) {
newBCD.addADigit((temp + carry) % 10);
carry = 0;
carry++;
}
count++;
}
return newBCD;
}
public BCD multiplyByTen() {
BCD oldBCD = new BCD(digit);
if (oldBCD.numberOfDigits() == 1 && oldBCD.nthDigit(0) == 0) {
BCD newBCD = new BCD(0);
return newBCD;
} else {
int[] newArray = new int[oldBCD.numberOfDigits() + 1];
newArray[0] = 0;
for (int i = 1; i < newArray.length; i++) {
newArray[i] = oldBCD.nthDigit(i - 1);
}
BCD newBCD = new BCD(newArray);
return newBCD;
}
}
public BCD multiplyBy(int num) {
int[] digit2 = new int[digit.length + num];
System.out.println("Num: " + num);
for (int i = 0; i < digit.length; i++) {
digit2[i] = digit[i];
}
int length = 0;
if (digit.length > num) {
length = num;
} else {
length = digit.length;
}
if (num == 0) {
BCD newBCD = new BCD(0);
return newBCD;
} else if (num == 1) {
BCD newBCD = new BCD(digit);
return newBCD;
} else if (num == 10) {
BCD newBCD = new BCD(digit);
newBCD = newBCD.multiplyByTen();
return newBCD;
}
BCD newBCD = null;
int temp = 0;
int carry = 0;
for (int count = 0; count < (digit2.length); count++) {
if (count == 0) {
temp = digit2[count] * num;
if ((temp + carry) == 0 && count >= length) {
} else {
newBCD = new BCD((temp + carry) % 10);
}
carry = temp / 10;
} else {
temp = digit2[count] * num;
if ((temp + carry) == 0 && count >= length) {
} else {
newBCD.addADigit((temp + carry) % 10);
}
carry = temp / 10;
}
}
return newBCD;
}
public BCD multiplyBCDs(BCD other) {
BCD thisBCD = new BCD(digit);
BCD newBCD = new BCD(0);
int DIGIT = 0;
do {
newBCD = newBCD.addBCDs(other.multiplyBy(thisBCD.nthDigit(DIGIT)));
System.out.println("thisBCD nthDigit: " + thisBCD.nthDigit(DIGIT));
other = other.multiplyByTen();
System.out.print("\nOther: ");
other.print();
DIGIT++;
} while (DIGIT < thisBCD.numberOfDigits());
return newBCD;
}
// public static BCD factorial(int num) {
// return newBCD; // this is a different newBCD you still need to create
// }
}
驱动程序:
public class BCDDriver {
public static void main(String[] args) {
BCD B1 = new BCD(22);
System.out.print("B1: ");
B1.print();
B1 = B1.multiplyBy(2);
System.out.print("\nProduct: ");
B1.print();
BCD B2 = new BCD(22);
System.out.print("\nB2: ");
B2.print();
BCD B3 = new BCD(22);
System.out.print("\nB3: ");
B3.print();
B2 = B2.multiplyBCDs(B3);
System.out.print("\nProduct: ");
B2.print();
}
}
最佳答案
这里有几个问题。我不会为你做作业,但是:
在 add 方法中,您将 this.digit[count]
添加到 other.nthdigit(count)
。您应该将 this.digit[count]
添加到 other.digit[count]
或将 this.nthdigit(count)
添加到 other .nthdigit(count)
,取决于循环的运行方式。 (这个问题可以通过使用 222 等测试值来掩盖:不要这样做)。
add方法的其余部分基本上是废话。无需为每个数字创建新的 BCD
,例如:您可以直接将所有加法添加到目标数组中。你需要写下加法的手工方法并实现它。大约有五行代码,而不是四十行。
实际上没有必要在`multiplyByTen() 方法中创建一个非零的特殊情况,尽管出于速度原因我可能会这样做。没有必要证明您对问题的理解。
类似地,您的 multiplyBy()
方法的长度大约是所需长度的四倍。只是事情没那么复杂。只需要 4-5 行代码。在这里,您再次为每个数字创建一个新的 BCD
,这是不必要的,并且与其他地方的特殊大小写零的想法背道而驰。事实上,除了作为性能优化之外,零在任何地方都不是特殊情况。
您的 multiplyBCDs()
方法看起来非常优雅,与其他方法不同,但我不相信它可以正确处理进位。
关于java - 方法返回 222 * (2 + 2 + 2) 而不是 222 * 222,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33989069/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!