我试图在基数中表示一个正整数(每个基数都在 范围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();
}
我会很感激一些建议。 感谢
答案 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;
}
计算出首先需要多少位数,设置正确大小的向量来存储它然后将每个数字从末端向前写入。 然后它抓取一个指向数据的指针,以便输出它。
答案 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;
}
这不是那么有效,因为每个数字需要两个分区。