数字的基本表示 - 输出顺序相反

时间:2014-10-16 06:18:58

标签: c++ reverse base

我试图在基数中表示一个正整数(每个基数都在 范围2到16)它的工作,但我得到的输出是所需输出的反向,例如' 2'的二进制表示。应该是10但我得到了#01; 01'这是我的代码

#include<iostream.h>
#include<conio.h>
#include<math.h>

int main(void)
{
    int b, number, i, result;
    cout << "Enter the the number "<< endl;
    cin >> number;

    if (number < 0)
    {
        cout << "Number is not valid, as it must be greater than or equal to 0 \n";
        system("PAUSE");
        return 0;
    }

    cout<<"Enter the base value"<< endl;
    cin >> b; 


    if(b < 2 || b > 16){
        cout << "Base is not valid.\n";
        system("PAUSE");
        return 0;    
    }

    cout << "The representation of the number with base " << b << " is" << endl;  

    while(number > 0)  //number in base 10
    {
        result = number%b; 
        number = number/b;
        i++;                    

        if (result == 10)
        {
            cout << "A";
        }
        if (result == 11)
        {
            cout<<"B";
        }
        else if (result == 12)
        {
            cout<< 'C';
        }
        else if( result == 13)
        {
            cout<<"D";
        }
        else if (result == 14)
        {
            cout << "E";
        }
        else if(result == 15)
        {
            cout << "F";
        }
        else {
            cout << result ;
        }

    }

    getch();
}

我会很感激一些建议。 感谢

4 个答案:

答案 0 :(得分:1)

在特定基础中输出数字时,这是一个常见问题。通过基数除以模数得到最后一个(最不重要)数字。您应该为可以放置每个数字的数字维护一个缓冲区,然后以相反的顺序输出缓冲区的内容。请考虑以下示例:

vector<char> buffer;
while(number > 0)  //number in base 10
{
  result = number%b; 
  number = number/b;
  i++;                    

  if (result >= 10)
    buffer.push_back((char)(result-10)+'A');   // alphabet is contiguous in ascii,
                                               // so you don't need a huge if

  else
    buffer.push_back((char)result+'0');
}
for(i = buffer.size()-1; i >=0; --i)
    cout << buffer[i];

对于转换,维护查找表会更好:

const char *hextable = "0123456789ABCDEF";
vector<char> buffer;
while(number > 0)  //number in base 10
{
      result = number%b; 
      number = number/b;
      buffer.push_back(hextable[result]);
}

for(i = buffer.size()-1; i >=0; --i)
    cout << buffer[i];

修改 如果您希望将输出放在字符串而不是控制台中,则可以使用字符串流:

// ...
while(number > 0)
{ 
// ...
}

stringstream ss;
for(i = buffer.size()-1; i >=0; --i)
    ss<< buffer[i];

string theString = ss.str();

请注意,您必须#include <sstream>才能对其进行定义。

答案 1 :(得分:1)

result % base将始终抓取需要打印的最后一个字符。因此,我们需要以某种方式反转输出。

<强>递归:
执行打印的递归函数可以反转输出。因为它是递归的,所以它使用堆栈作为堆栈。因此,我们的输出得到了LIFO顺序 只需通过调用此代码替换while循环:

rec_print(int number, int base)
{
    rec_print(number/base, base);
    int result = number / base;
    if ( result <= 0) {return;}
    result += result<10?'0':'A'-10;
    cout << result;
    return;
}

请注意,低基数中的愚蠢数字可能导致(混乱)堆栈溢出。

只要result += result<10?'0':'A'-10;result

result >=0就可以很好地将result < 16转换为ascii

非递归:
对于非递归版本,这个怎么样?从后面填充“数组”(使用vector进行运行时调整),然后打印出来。

void print_number(int number, int base)
{
    int result;
    int number_of_digits = log(number)/log(base) +1;   //+1 because '/' truncates and we want to always round up.
    vector<char> output(number_of_digits+1); //vector<char> of the right size (+1 for null terminator)
    output[number_of_digits+1] = 0; //null terminate.
    while (number_of_digits--)
    {
        result = number % base;
        result += result<10?'0':'A'-10;
        output[number_of_digits] = result;
        number /= base;
    }
    std::cout << &output[0]<<endl;
}

计算出首先需要多少位数,设置正确大小的向量来存储它然后将每个数字从末端向前写入。 然后它抓取一个指向数据的指针,以便输出它。

See it in action

答案 2 :(得分:0)

您正在反向打印该号码:number%b从该号码中提取最后一个base-b数字,但它是您打印的第一个数字。

要以正确的顺序打印数字,您必须以某种方式反转序列,以便最后打印最后一位数字。例如,您可以将数字添加到矢量或将其写入字符串,然后将其反转。

答案 3 :(得分:0)

要以正确的顺序获取数字,您可以工作&#34;向后&#34;。首先找到超过数字的基数的最小幂,提取数字,然后继续使用较低的幂。

// Find the smallest power
w= 1;
while (w * b <= n)
{
  w*= b;
}

// Extract the digits
while (w > 0)
{
   digit= n / w;
   n-= digit * w;
   w/= b;
}

这不是那么有效,因为每个数字需要两个分区。