C++ 直接添加两个八进制数,而不转换为十进制数

C++ 直接添加两个八进制数,而不转换为十进制数,c++,c,logic,addition,number-systems,C++,C,Logic,Addition,Number Systems,我试图通过添加相应的数字来添加两个八进制数,但是,当数字之和大于7时,我被卡住了。我必须进行一次进位,并将其添加到下一个添加周期。我找不到正确的表达式来考虑进位并计算最后的和。 另一个要考虑的情况是八进制数字A和B在数字中没有相同的位数,EX:6和13 6 + 13=21。我无法为while循环建立一个条件,如果两者的位数相同,我可以运行while循环,直到其中一个或两个都变为零 请有人帮忙/填写以下代码: int octal_sum(int a,int b) //a and b and

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

另一个要考虑的情况是八进制数字A和B在数字中没有相同的位数,EX: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
}
由于您要传递整数,我假设您使用的是十进制编码的八进制*,即仅使用数字0到7的十进制数。例如,数字1238实际上是8310,将使用您的方案编码为12310

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

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
}

*这类似于二进制编码的十进制表示法,即使用能够存储十六进制数字的表示法来存储十进制数字。

以下是我创建的函数。重要的是要记住随身携带的物品。因为如果你的数字加起来更长,比如:7777+14=10013,如果你忽略进位,代码只会返回四位数字,即你的最长数字长度0013,也就是13。不好的。因此,我们需要考虑进货。我们必须继续循环,直到我们的数字和进位都为0

此外,如果通过计算a%10+b%10+进位获得的数字小于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;
}
希望对你有帮助

我使用StringBuilder附加字符,这比使用字符串要好,它是不可变的。 2.通过将字符串转换为字符数组从字符串中读取字符,通过从其ASCII值“0”中减去字符将字符转换为整数

确保也要处理随身携带的箱子
您可以使用a+b并使用std::oct进行输入/输出,但这太简单了。八进制/十进制/十六进制int之间没有任何区别。它始终是二进制的,这是您读取/打印它的方式。如何表示八进制数?参数int a,int b不是八进制数,除非您有一台不同寻常的计算机。八进制是一种文本格式。LogicStuff和@WeatherVane int a,b不是数据类型的八进制数,同意,但我有存储在其中的八进制数,虽然可能有8和9,但我确保我传递的是纯八进制数parameter@Abhilashk你接受了这个好答案,但你的第二个问题是指八进制值的位数不同。我建议您最好使用数字数组算法。找出哪个数组较短。将两个数组相加,并使用最后的进位继续从较长的数组中求和。完美+为了正确的解释和教我十进制编码octals@Abhilashk老实说,我是在用二进制编码的小数进行类比之后当场提出这个术语的。两种情况下的想法完全相同;唯一的区别是,在你的例子中是8和10,而在BCD中是10和16。尝试20和62并输入到函数中,有些错误。你可能想添加一些解释,说明你的代码有什么不同,以及它如何解决问题。HI@AbhilashKishore,我添加了解释,可以向上投票吗
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();
}