我被困在一个项目中,我必须打印出10-16之间任何基数的任何数字。问题在于,在那些基础中,您必须在前面添加一个字母,我真的不太了解如何使用递归。谁能帮我吗?
Dim objFSO, strDirectory, strFile
Set oShell = CreateObject ("WScript.Shell")
'getting script location
strPath = WScript.ScriptFullName
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile(strPath)
strFolder = objFSO.GetParentFolderName(objFile)
'define directory & file
strDirectory = oShell.ExpandEnvironmentStrings("%USERPROFILE%")
strFile = strDirectory & "\Desktop\My Program.lnk"
If objFSO.FileExists(strFile) Then
'DO NOTHING
Else
strDesk = "desktoplink.vbs"
oShell.Run strDesk, 0, False
End If
'enclosing path to support spaces
HMIpath = strFolder & "\CHK.bat"
HMIpath = """" & HMIpath & """"
Dim strArgs
strArgs = "cmd /c " & HMIpath
oShell.Run strArgs, 0, False
如果我的底数是246,我得到156。我知道实际答案应该是F6。转换时15转换为F。但是我该怎么办?
答案 0 :(得分:1)
您似乎只停留在碱基之间转换的问题上。我可以想到两种方法:
通过将基数的幂从n-1减小到0,其中n是最大幂。这要求您知道可能必须转换的最大值。每个格在与该幂对应的位置给您一个数字。使用您的示例,您可以决定最多四位数,因此您将:
246/16 ^^ 3 = 0 246/16 ^^ 2 = 0 246/16 ^^ 1 = F 6/16 ^^ 0 = 6
所以答案是0x00F6。
使用模运算,将基数的幂从1增大到n。同样,每个操作都会在与基数幂相对应的位置给出一个数字。使用相同的示例:
246 mod 16 ^^ 1 = 6 240 mod 16 ^^ 2 = F
同样,您得到的是0xF6。
答案 1 :(得分:1)
类似
Name C2Count C3Count C4Count
AAA 2 2 3
BBB 1 1 1
和
static const char* digits = "0123456789abcdef";
是一个很好的方法。 cout << digits[num % base];
只是意味着static
具有全局生存期,但范围仅限于您的函数(基本上,您不必每次输入函数时都重新创建它)。
答案 2 :(得分:0)
这是一个使用okovkos答案和Calebs第二种解决方案中类似方法在代码中带有注释的版本。它以最低有效数字开头并提取,直到num
为零为止。它支持使用(INTMAX_MIN, INTMAX_MAX]
范围内的底数来进行[2, 36]
范围内的转换。
#include <iostream>
#include <string>
#include <cstdint> // std::intmax_t, std::uintmax_t
std::string itos(
std::intmax_t num, // number to convert, range: (INTMAX_MIN, INTMAX_MAX]
const int base=10, // base, range: [2, 36]
const std::string& prefix="", // user defined prefix
bool add_plus=false) // add plus sign for positive numbers
{
static const std::string digits = "0123456789abcdefghijklmnopqrstuvwxyz";
if(base>36 || base<2) return ""; // erroneous base
std::string rv; // the return value we'll create
if(num) {
bool negative = false;
if(num<0) {
if(num==INTMAX_MIN) return ""; // the ONE std::intmax_t number you can't use
// make it positive for the calculation
num = -num;
negative = true;
}
std::uintmax_t x;
while(num) {
x = num % base; // extract least significant digits index
rv.insert(rv.begin(), digits[x]); // insert digit first
num -= x; // reduce num with the extracted value
num /= base; // divide num down for next extraction
}
// the below two inserts could be moved to just before the
// return if you want to add the prefix for the value zero too
// insert prefix
rv.insert(0, prefix);
// insert minus sign if negative or plus if desired
if(negative) rv.insert(rv.begin(), '-');
else if(add_plus) rv.insert(rv.begin(), '+');
} else rv = "0"; // special case
return rv;
}
int main() {
std::cout << "bin " << itos(255, 2, "0b") << "\n";
std::cout << "oct " << itos(255, 8, "0") << "\n";
std::cout << "dec " << itos(255, 10, "", true) << "\n";
std::cout << "hex " << itos(-INTMAX_MAX, 16, "0x") << "\n";
std::cout << "hex " << itos(INTMAX_MAX, 16, "0x") << "\n";
}
可能的输出:
bin 0b11111111
oct 0377
dec +255
hex -0x7fffffffffffffff
hex 0x7fffffffffffffff