gpt4 book ai didi

C++:基函数的变化(即十六进制到八进制、十进制等)- 十六进制值的输出略有偏差

转载 作者:行者123 更新时间:2023-11-28 06:39:24 25 4
gpt4 key购买 nike

我需要创建一个通用函数,它可以从任何起始基数更改为任何最终基数。我把所有东西都放下了,除了我的原始函数采用(并采用)一个 int 值作为它转换为另一个基数的数字。我决定只重载函数。我可以在每个基数之间进行更改,但在使用我的新函数接收字符串十六进制值时会略有偏差。

下面的代码应该为这两个函数输出 1235。它适用于第一个,但对于第二个,我目前得到 1347。十进制到十六进制工作正常 - 它只是重载函数(十六进制到其他任何东西)稍微偏离。

谢谢。

#include <iostream>
#include <stack>
#include <string>
#include <cmath>

using namespace std;

void switchBasesFunction(stack<int> & myStack, int startBase, int finalBase, int num);
void switchBasesFunction(stack<int> & myStack, int startBase, int finalBase, string s);

int main()
{

stack<int> myStack;
string hexNum = "4D3";

switchBasesFunction(myStack, 8, 10, 2323);

cout << endl << endl;

switchBasesFunction(myStack, 16, 10, hexNum);


return 0;
}

void switchBasesFunction(stack<int> & myStack, int startBase, int finalBase, int num)
{

int totalVal = 0;

string s = to_string(num);

for (int i = 0; i < s.length(); i++)
{
myStack.push(s.at(i) - '0');
}

int k = 0;

while (myStack.size() > 0)
{
totalVal += (myStack.top() * pow(startBase, k++));
myStack.pop();

}

string s1;

while (totalVal > 0)
{

int temp = totalVal % finalBase;
totalVal = totalVal / finalBase;

char c;
if (temp < 10)
{
c = temp + '0';
s1 += c;
}

else
{
c = temp - 10 + 'A';
s1 += c;
}

}
for (int i = s1.length() - 1; i >= 0; i--)
{
cout << s1[i];
}
cout << endl << endl;
}

void switchBasesFunction(stack<int> & myStack, int startBase, int finalBase, string s)
{

int totalVal = 0;

for (int i = 0; i < s.length(); i++)
{
myStack.push(s.at(i) - '0');
}

int k = 0;

while (myStack.size() > 0)
{
totalVal += (myStack.top() * pow(startBase, k++));
myStack.pop();

}

string s1;

while (totalVal > 0)
{

int temp = totalVal % finalBase;
totalVal = totalVal / finalBase;

char c;
if (temp < 10)
{
c = temp + '0';
s1 += c;
}

else
{
c = temp - 10 + 'A';
s1 += c;
}

}
for (int i = s1.length() - 1; i >= 0; i--)
{
cout << s1[i];
}
cout << endl << endl;
}

最佳答案

抱歉,我在理解您的代码时遇到问题,所以我想我会简化它。
这是算法/代码(未经测试):

void convert_to_base(const std::string& original_value,  
unsigned int original_base,
std::string& final_value_str,
unsigned int final_base)
{
static const std::string digit_str =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if ((original_base > digit_str.length()) || (final_base > digit_str.length())
{
std::cerr << "Base value exceeds limit of " << digit_str.length() << ".\n";
return;
}

// Parse string from right to left, smallest value to largest.
// Convert to decimal.
unsigned int original_number = 0;
unsigned int digit_value = 0;
int index = 0;
for (index = original_value.length(); index > 0; --index)
{
std::string::size_type posn = digit_str.find(original_value[index];
if (posn == std::string::npos)
{
cerr << "unsupported digit encountered: " << original_value[index] << ".\n";
return;
}
digit_value = posn;
original_number = original_number * original_base + digit_value;
}

// Convert to a string of digits in the final base.
while (original_number != 0)
{
digit_value = original_number % final_base;
final_value_str.insert(0, 1, digit_str[digit_value]);
original_number = original_number / final_base;
}
}

*警告:代码未通过编译器测试。**

关于C++:基函数的变化(即十六进制到八进制、十进制等)- 十六进制值的输出略有偏差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26223682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com