C语言 两个八进制数直接相加,不转换为十进制数

tjvv9vkg  于 2023-03-17  发布在  其他
关注(0)|答案(4)|浏览(169)

我试图通过将两个八进制数相加来将它们相加,但是,当数字之和大于7时,我就卡住了。我必须进行进位并将其加到下一个加法循环中。我找不到正确的表达式来考虑进位并计算最终的和。
要考虑的另一种情况是八进制数ab的位数不相同,例如:6和13(6+13=21 inoctal)。我无法为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
}
ss2ws0br

ss2ws0br1#

因为你传递的是int s,我假设你使用的是十进制编码的八进制数 *,也就是说,十进制数只使用0到7(包括0和7),例如,数字1238实际上是8310,使用你的方案,它将被 * 编码 * 为12310。

*确定停止条件-您希望while循环继续,直到数字abcarry都变为零。换句话说,条件应为a || b || carry
*将下一位数字加到和中-由于结果是十进制的,你需要将数字d乘以下一个连续的10的幂,一个简单的方法是添加一个新变量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
}

Demo.

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

2guxujil2#

这是我做的函数。记住进位是很重要的。因为如果你的数字加起来更长(例如:7777 + 14 = 10013)如果你忽略进位,代码只会返回4位数(你的最长数字),所以0013,也就是13,不太好,所以我们需要考虑进位,我们必须继续循环,直到我们的数字进位都是0。
更进一步,如果你计算a%10 + b%10 + carry得到的数字小于8,那么我们就不再需要再次进位,所以我们需要重新设置这个值。
注意我用的是位数排序整数,它基本上允许我把位数加到和的开头,方法是乘以10的幂,然后把它加到和上。
最终代码如下所示。

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;
}

希望对你有帮助!

sd2nnvve

sd2nnvve3#

我写得尽可能简单

#include<iostream>
#include<cmath>
using namespace std;

int sum(int x, int y)
{
    int r1, r2;
    int sum = 0;
    int carry = 0;
    int i = 0;
    

    while (x != 0 || y != 0)
    {
        r1 = x % 10;
        r2 = y % 10;
        int s = r1 + r2 + carry;
        if (s < 8)
        {
            sum = sum + (s * pow(10, i));
            carry = 0;
        }
        
        else
        {
            // Do write s%8 rather writing (r1+r2+carry-8)
            sum = sum + (s%8 * pow(10, i));
            carry = 1;
        }
        x = x / 10;
        y = y / 10;
        i++;
        
    }
    if (carry == 1)
    {
        sum = sum + (1 * pow(10, i));
    }
    return sum;
}
int main()
{
    int x, y;
    cout << "Enter two numbers:\n";
    cin >> x >> y;
    cout << sum(x, y);
}
iaqfqrcu

iaqfqrcu4#

1.我使用StringBuilder来添加字符,这比使用字符串要好,它是不可变的。
2.read 通过将字符串转换为字符数组来从字符串中提取字符,通过从ASCII值“0”中减去字符来将字符转换为整数
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();
}

相关问题