【问题标题】:How to reverse a negative integer recursively in C++?如何在 C++ 中递归地反转负整数?
【发布时间】:2016-04-01 20:05:49
【问题描述】:

我正在做一些递归练习,我需要编写一个反转整数输入的程序

输入示例:cin >> 12345;输出应该是 54321

但如果该整数为负数,则只需将负号附加到第一个数字。

输入示例:cin >> -1234;输出-4321

我很难让我的程序适应负数。如果我运行,我设置它的方式

测试示例:12345 我得到正确的输出 54321

所以我的递归和基础是成功的。但是如果我跑负我会得到 ​​p>

测试示例:-12345 我得到这个是因为我不明白 -5-4-3-2 1

#include<iostream>
using namespace std;
void reverse(int);
int main()
{
    int num;
    cout << "Input a number : ";
    cin >> num;
    reverse(num);
    return 0;
}


void reverse(int in)
{
    bool negative = false;
    if (in < 0)
    {
        in = 0 - in;
        negative = true;
    }

    if (in / 10 == 0)
        cout <<  in % 10;
    else{
        if (negative == true)
            in = 0 - in;
        cout << in % 10;
        reverse(in / 10);
    }
}

【问题讨论】:

  • if (in
  • 你为什么不直接打印一个- 然后用-in 正常继续?
  • cin &gt;&gt; 12345 什么?
  • @JoachimPileborg:我猜是在cin &gt;&gt; 提示符下输入12345 的控制台记录。该代码块并没有伪装成 C++ 代码。
  • 保持数字为字符序列。反转字符串比反转数字更简单。

标签: c++ recursion


【解决方案1】:

要反转一个负数,你输出一个-,然后反转相应的正数。我建议使用递归而不是状态,如下所示:

void reverse(int in)
{
    if (in < 0)
    {
        cout << '-';
        reverse(-in);
    }
    else
    {
       // code to recursively reverse non-negative numbers here
    }
}

【讨论】:

  • 或者只写in = -in 并完整进入普通代码。
  • @MartinBonner 通常我会这样做,但他特别想递归地这样做。
  • 这完美地递归应用到我的代码中,但是必须否则,否则你会得到这些疯狂的重复,其中负数应用于每个数字
【解决方案2】:

reverse 函数拆分为两部分:第一部分仅打印-(如果输入为负数),然后调用第二部分,即您拥有的递归代码。 (您不再需要任何 if (negative) ... 处理,因为第一部分已经处理了它。)

顺便说一句,if (bool_variable == true) ... 过于冗长。如果您说if (value_is_negative) ... 之类的内容,则更容易阅读代码。

【讨论】:

    【解决方案3】:

    您的递归函数不保持状态。当您第一次递归时,它会打印“-”符号,但每次您将负数发送回递归时,它都会像第一次一样运行并再次打印“-”。

    最好在第一次看到负数时打印“-”,然后将其余数字作为正值发送给递归。

    #include<iostream>
    using namespace std;
    void reverse(int);
    int main()
    {
        int num;
        cout << "Input a number : ";
        cin >> num;
        reverse(num);
        return 0;
    }
    
    
    void reverse(int in)
    {
        bool negative = false;
        if (in < 0)
        {
            in = 0 - in;
            negative = true;
        }
    
        if (in / 10 == 0)
            cout <<  in % 10;
        else{
            if (negative == true) {
                cout << '-';
                negative = false;
            }
            cout << in % 10;
            reverse(in / 10);
        }
    }
    

    【讨论】:

      【解决方案4】:
      int reverse(long int x) {
           
      long int reversedNumber = 0, remainder;
                 bool isNegative = false;
          
          
          if (x <0){
              isNegative = true;
               x *= -1;
          }
      
      
      
      while(x > 0) {
          remainder = x%10;
          reversedNumber = reversedNumber*10 + remainder;
          x= x/10;
          
      }
          
          if  (isNegative) {
              
              if (reversedNumber > INT_MAX){
                  return 0;
              }
              else
                  return reversedNumber*(-1);
              
          }
               
          
          else 
          {
              if (reversedNumber > INT_MAX){
              
               return 0;
          }
              else 
                  return reversedNumber;
              
          }
               
      
         
          
      }
      

      【讨论】:

        猜你喜欢
        • 2014-04-03
        • 2019-07-25
        • 2012-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-02
        • 1970-01-01
        • 2012-10-20
        相关资源
        最近更新 更多