【问题标题】:How to extract each digit from int without using stack or array? (C++)如何在不使用堆栈或数组的情况下从 int 中提取每个数字? (C++)
【发布时间】:2017-09-20 18:47:44
【问题描述】:

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

问题是我只知道如何以相反的顺序提取数字(例如:先提取 1,然后为 90621 提取 2),我不知道如何按顺序提取。我在这里看到了一些帖子,人们将数字转换为字符串,但我不能这样做,因为我正在调用的函数之一需要一个 int 作为参数。到目前为止,我们还只介绍了循环和 if 函数等基础知识,所以我不确定如何使用堆栈或数组。

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

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) 它通过将数字分解为单个数字、对该数字进行编码并将其添加到字符串返回值来返回整个条形码。

【问题讨论】:

  • 你了解过递归吗?迭代加上一个堆栈 == 递归。
  • 我们已经学习了基本的递归,但我不熟悉如何将数字压入堆栈。
  • Here 是一个关于如何“倒退”的小例子。
  • 基本上得到了相反的结果吧?为什么不手动反转呢?

标签: c++ loops int modulo


【解决方案1】:

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

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

基本上,您将调用堆栈用作存储先前字符串的堆栈。这也是编写此函数的最小方式。

【讨论】:

    【解决方案2】:

    您可以在将每个数字转换为 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;
    }
    

    【讨论】:

      【解决方案3】:

      一种解决方案可能是:

      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;
      }
      

      【讨论】:

        【解决方案4】:

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

        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'));
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-07
          • 2018-06-06
          • 2015-04-13
          • 2012-05-09
          • 1970-01-01
          • 2014-05-19
          • 2012-07-12
          • 1970-01-01
          相关资源
          最近更新 更多