-1

我试图通过添加相应的数字来添加两个八进制数,但是,当数字总和大于 7 时,我被卡住了。我必须进行进位并将其添加到下一个加法周期. 我无法找到正确的表达式来考虑进位并计算最终总和。

要考虑的另一种情况是八进制数ab的位数不同时,例如:6 和 13(八进制中的 6+13=21 )。我无法为这种条件的 while 循环建立条件(如果两者的位数相同,我可以运行 while 循环,直到它们中的任何一个或两者都变为零)

有人可以帮助/完成以下代码:

int octal_sum(int a,int b)     //a and b and octal numbers
{
    int sum=0,carry=0,d=0;
    while(**???**)
    {
        d=0;
        d=carry+(a%10)+(b%10);
        a/=10;b/=10;
        if(d>7)
        {
            carry=1;
            d=d%8;
        }
        sum= **???**
    }
   return sum;     //returns octal sum of a and b
}
4

3 回答 3

3

由于您正在传递ints,我假设您使用的是十进制编码的八进制*,即仅使用数字 0 到 7 的十进制数,包括 0 到 7。例如,使用您的方案,实际上是 83 10的数字 123 8将被编码为 123 10 。

  • 确定停止条件- 您希望while循环继续直到两个数字ab和都carry变为零。换句话说,条件应该是a || b || carry
  • 将下一位数字添加到总和中- 由于结果编码为十进制,因此您需要将数字d乘以下一个连续的十次幂。一种简单的方法是添加一个新变量m,该变量从每次迭代开始1并乘以十。

结果将如下所示:

int octal_sum(int a,int b) {
    int sum=0, carry=0, d=0, m = 1;
    while(a || b || carry) {
        d=0;
        d=carry+(a%10)+(b%10);
        a/=10;b/=10;
        if(d>7) {
            carry=1;
            d=d%8;
        } else {
            carry = 0;
        }
        sum += d*m;
        m *= 10;
    }
   return sum;     //returns octal sum of a and b
}

演示。

*这类似于二进制编码十进制 ( BCD ) 表示,当使用能够存储十六进制数字的表示来存储十进制数字时。

于 2015-12-18T20:04:47.900 回答
1

这是我制作的功能。重要的是要记住携带。因为如果你的数字加起来更长(例如:7777 + 14 = 10013)如果你忽略进位,代码只会返回四位数字(你最长的数字长度),所以 0013,即 13。不好。所以我们需要考虑进位。我们必须继续循环,直到我们的数字进位都为 0。

再者,如果你计算得到的位数a%10 + b%10 + carry小于8,那么我们就不需要再进位了,所以我们需要重新设置这个值。

注意我使用的是数字等级整数,它基本上允许我通过乘以十的幂然后将其添加到总和来将数字添加到总和的开头。

最终代码如下所示。

int octal_sum(int a, int b)
{
    int sum = 0, digit = 0, carry = 0, digit_rank = 1;

    // Calculate the sum
    while (a > 0 || b > 0 || carry)
    {
        // Calculate the digit
        digit = a % 10 + b % 10 + carry;

        // Determine if you should carry or not
        if (digit > 7)
        {
            carry = 1;
            digit %= 8;
        }
        else
            carry = 0;

        // Add the digit at the beggining of the sum
        sum += digit * digit_rank;
        digit_rank *= 10;

        // Get rid of the digits of a and b we used
        a /= 10;
        b /= 10;
    }
    return sum;
}

希望对您有所帮助!

于 2015-12-18T20:27:47.713 回答
-1
  1. 我正在使用 StringBuilder 附加字符,这比使用字符串更好,它是不可变的。

2.通过将String转换为char数组从String中读取char,通过从其ASCII值'0'中减去将char转换为整数

  1. 确保也处理结转案例
private static String OctaNumberAddition(String o1, String o2) {
    StringBuilder sb = new StringBuilder();
    int carry = 0;
    for(int i = o1.length() - 1, j =o2.length()-1;i >= 0 || j >= 0;i--,j--){
        int sum = carry + (i >= 0 ? o1.charAt(i) - '0':0)+(j >= 0 ? o2.charAt(j) - '0':0);
        sb.insert(0,sum%8);
        carry = sum /8;
    }

    if(carry > 0){
        sb.insert(0,carry);
    }

    return sb.toString();
}
于 2020-03-27T21:52:48.890 回答