2

所以我写了这个小应用程序,它将十进制转换为八进制,它只输出正确的答案。例如,如果转换的答案是 17,应用程序会将其显示为 71。任何帮助将不胜感激。

;
    int _tmain(int argc, _TCHAR* argv[])
{   
int octal, total = 0;
    cout<< "please enter a decimal: ";
    cin >> octal;
    while(octal > 0)
    {
                total = octal % 8;
        octal /= 8;
        cout << total;
    }
    cout << endl;
        _getche(); 
        return 0;
}
4

5 回答 5

4

您可以使用 std::oct 以八进制表示法打印数字。

int n = 123;
std::cout << std::oct << n << std::endl;

同样,您可以使用十进制 -std::dec和十六进制 -等不同的符号打印数字std::hex

这些输入/输出操纵器允许用户以各种符号解析字符串数字。

int n;
std::istringstream("24") >> std::hex >> n;
std::cout << n << std::endl;  // n is 36 (decimal)
于 2013-11-10T18:00:39.930 回答
1

使用数组进行临时存储的解决方案:

int octal, total = 0, length=0;
char storage[12];   /* 11 octal digits add up to > 1 billion */
octal = 123;
while (octal > 0)
{
  storage[length] = octal % 8;
  octal /= 8;
  length++;
}
while (--length >= 0)
  printf ("%d", storage[length]);
printf ("\n");

(我碰巧处于 C 模式,因此将printfs. 更改为cout需要的位置。)

最重要的一点是你受storage大小的约束。您可以将其设置为合理的大小 - 您可以放入整数的最大正八进制大小是017777777777- ,甚至可以接受不合理的大小(您可以将其设置为 20,这只会浪费 8 个额外的字节;这些天,那没什么)。存储大小取决于您的数字以八进制表示的大小,对于您可以输入的最大数字。

假设您将两个8s 都更改为2; 然后您可以使用相同的例程进行二进制输出。但此时,输出字符数增加到 31 个!(比您的 [可能] 位数少一个int,因为最后一位会将数字切换为负数。您需要单独的代码来处理负数。)

它适用于所有 <=10 的基数(包括“基数 10”本身)。如果要扩展相同的代码以处理基数 >10,例如“十二进制”(基数 12)或十六进制(基数 16),则需要更改该printf行。这将使您的代码以 36 为底(“六进制”)。按照惯例,大于 9 的“数字”写成 A、B、C 等等:

while (--length >= 0)
  printf ("%c", storage[length] < 10 ? storage[length]+'0' : storage[length]+'A'-10);

(当我在撰写本文时,为了方便起见,我使用了三元运算符?..:..,而不是需要更多输入的单独的if..else。(OTOH,添加注释否定了增益。哦,好吧 - 至少你了解三元运算符,以及几个数字基数的名称。))


另一种解决方案是使用递归。这是一个有用的方法,因为它不需要在内存中预先分配一些空间——相反,它依赖于内部调用堆栈。

原则是您编写一个仅打印您的号码的最后一位数字的函数 - 但在此之前,除非余数为 0,否则它会使用该号码的余数调用自身

所以函数调用自己,然后打印它应该的数字。因为它首先调用自己,所以被调用的版本会打印它应该打印的数字—— “原始”函数中数字左边的数字。以此类推,直到没有剩余要打印的数字为止。从那时起,最后被调用的函数打印它的编号(即最左边的数字),返回到调用它的函数,该函数又打印它的编号(向右多一个),一直到原来的称呼。

递归是一项非常酷的掌握技能,所以一定要试试这个!

于 2013-11-10T23:29:42.547 回答
1

这里有两个可能有用的方便的功能。它们为每个转换返回字符串。与igleyy的答案类似。

string toOctalFromDecimal (int num) {
    ostringstream o;
    o << std::oct << num;
    return o.str();
}

string toDecimalFromOctal (int num) {
    std::ostringstream o;
    int x;

    std::istringstream(to_string(num)) >> std::oct >> x;
    o << std::dec << x;
    return o.str();
}
于 2015-03-04T16:41:22.150 回答
1

您需要取一个总和,然后打印最终结果,例如

int n=0;
while (octal > 0) {
  total += (pow(10,n++))*(octal % 8);
  octal /= 8;
}
cout << total << endl;

只需打印数字就会以相反的顺序打印它们,因为您首先打印最小的位。

如评论中所述,上述机制仅适用于转换为小于 10 的基数。

于 2013-11-10T17:52:13.393 回答
1

你做得很好,但你必须以相反的顺序打印余数才能得到正确的答案。例如,如果 ans 是 17,那么十进制等值将是 1*8^1+7*8^0 。个位将是数字除以 8 得到的余数,左边的下一个数字是数字除以 8^2 得到的余数,依此类推。因此,如果八进制数是 n 位,那么最高有效位将是通过将该数字除以 8^n 获得的余数。这就是为什么您必须以相反的顺序打印余数的原因。

于 2013-11-10T18:09:57.327 回答