如何在不使用堆栈或数组的情况下从INT中提取每个数字?(C )

How to extract each digit from int without using stack or array? (C++)

本文关键字:提取 INT 数字 情况下 堆栈 数组      更新时间:2023-10-16

我有一个分配,我想在输入一个数字时打印特定代码,例如90621。数字9打印代码 ->提取0(按顺序)。

问题是我只弄清楚如何以相反的顺序提取数字(例如:首先提取1,然后在90621中提取2),而我不确定如何按顺序进行操作。我已经在这里看到了一些帖子,人们将数字转换为字符串,但是我无法做到这一点,因为我称之为的功能之一将INT作为参数。我们还只涵盖了诸如循环之类的基础知识,并且如果运行范围到目前为止,我不确定如何使用堆栈或数组。

这是我提取数字并打印代码到目前为止的代码:

string barCode(int zip){
    string result;
    int n;
    while (zip > 0){
        n = zip % 10;
        result += codeForDigit(n);
        zip = zip / 10;
    }
    return result;
}

有关功能的一些信息: - 函数 Codefordigit(int Digit)取一个数字并返回该数字的代码。 -barCode(int zip)通过将数字分解为单个数字,编码该数字并将其添加到字符串返回值中,从而返回整个条形码。

一种简单的方法是通过递归。实际上,它非常优雅。您可以写这样的东西:

string barCode(int zip)
{
    if (zip <= 0) return "";
    return (barCode(zip / 10) + codeForDigit(zip % 10));
}

基本上,您正在使用呼叫堆栈作为存储先前字符串的堆栈。这也是编写此功能的最小方法。

您可以在转换为char每个数字后逆转字符串结果:

std::string barCode(int zip){
    std::string result;
    while(zip > 0){
        result += zip % 10 + '0';
        zip /= 10;
    }
    std::reverse(result.begin(), result.end());     
    return result;
}

int main(){
    std::cout << barCode(245) << std::endl;
    return 0;
}

一个解决方案可能是:

string barCode(int zip)
{
    string result;
    if(zip <=0) return "";
    //Find 10s in zip
    int i=zip/10;
    int nTens = 0;
    while( i<=0)
    {
        i = i/10;
        nTens++;
    }
    int n;
    for (int j=0; j<=nTens ; j++)
    {
        n = zip / pow(10, (nTens-j));
        result += codeForDigit(n);
        zip = zip - n * pow(10, (nTens-j))
    }
    return result;
}

我认为简单的方法是在字符串中转换数字,并在其上进行迭代:

int zip = 123456789;
std::string digits = std::to_string(zip);
std::string barcode;
int d=0;
for (auto it=digits.begin(); it != digits.end();it++)
{
    d= int(*it);
    barcode.push_back(codeForDigit(d-'0'));
}