两个八进制数直接相加不转十进制
Add two octal numbers directly without converting to decimal
我正在尝试通过添加相应的数字来添加两个八进制数,但是当数字之和大于 7 时,我被卡住了。我必须进位并添加它进入下一个加法周期。我无法找到正确的表达式来考虑进位和计算最终总和。
另一种情况是八进制数 a 和 b 的位数不同,例如:6 和 13 (八进制 中的 6+13=21)。对于这种情况,我无法为 while 循环建立条件(如果两者的位数相同,我可以 运行 while 循环直到其中一个或两个都变为零)
有人可以help/complete下面的代码吗:
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
}
由于您传递的是 int
s,我假设您使用的是十进制编码的八进制数 *,即仅使用数字 0 到 7 的十进制数,包括.例如,数字 1238 实际上是 8310 将 coded 为 12310 使用你的方案。
- 确定停止条件 - 您希望
while
循环继续,直到数字 a
、b
和 carry
转零。也就是说,条件应该是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
}
* 这类似于二进制编码的十进制 (BCD) 表示,当使用能够存储十六进制数字的表示来存储十进制数字时。
这是我做的功能。记住进位很重要。因为如果你的数字加起来更长(例如:7777 + 14 = 10013),如果你忽略进位,代码将只有 return 四位数字(你最长的数字长度),所以 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;
}
希望对您有所帮助!
- 我正在使用 StringBuilder 来附加字符,这比使用字符串更好,它是不可变的。
2.read 通过将 String 转换为 char 数组从 String 中获取 char,通过从其 ASCII 值中减去 '0' 将 char 转换为整数
- make sure handle the carryforward case too
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();
}
我正在尝试通过添加相应的数字来添加两个八进制数,但是当数字之和大于 7 时,我被卡住了。我必须进位并添加它进入下一个加法周期。我无法找到正确的表达式来考虑进位和计算最终总和。
另一种情况是八进制数 a 和 b 的位数不同,例如:6 和 13 (八进制 中的 6+13=21)。对于这种情况,我无法为 while 循环建立条件(如果两者的位数相同,我可以 运行 while 循环直到其中一个或两个都变为零)
有人可以help/complete下面的代码吗:
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
}
由于您传递的是 int
s,我假设您使用的是十进制编码的八进制数 *,即仅使用数字 0 到 7 的十进制数,包括.例如,数字 1238 实际上是 8310 将 coded 为 12310 使用你的方案。
- 确定停止条件 - 您希望
while
循环继续,直到数字a
、b
和carry
转零。也就是说,条件应该是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
}
* 这类似于二进制编码的十进制 (BCD) 表示,当使用能够存储十六进制数字的表示来存储十进制数字时。
这是我做的功能。记住进位很重要。因为如果你的数字加起来更长(例如:7777 + 14 = 10013),如果你忽略进位,代码将只有 return 四位数字(你最长的数字长度),所以 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;
}
希望对您有所帮助!
- 我正在使用 StringBuilder 来附加字符,这比使用字符串更好,它是不可变的。
2.read 通过将 String 转换为 char 数组从 String 中获取 char,通过从其 ASCII 值中减去 '0' 将 char 转换为整数
- make sure handle the carryforward case too
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();
}