【问题标题】:c program for the reverse the digits反转数字的c程序
【发布时间】:2011-01-22 00:23:08
【问题描述】:

我正在寻找 C 程序来反转如下数字:

如果我输入:

123456

那么结果就是:

654321

请帮帮我。

【问题讨论】:

  • 请学习如何聪明地回答问题。
  • 看起来像一个著名的“C”面试题:-)
  • 你现在正在接受采访吗?那我们还是赶紧解决你的问题吧。

标签: c reverse


【解决方案1】:

这是这个复杂问题的简单解决方案:

#include <stdio.h>

int main()
{
    int ch;
    ch = getchar();
    if (ch != '\n') {
        main();
        printf("%c", ch);
    }
}


输出换行符的新版本:
#include <stdio.h>
#include <stdlib.h>

static void newline(void)
{
    printf("\n");
}

int main()
{
    int ch;
    ch = getchar();
    if (ch != '\n') {
        main();
        printf("%c", ch);
    } else {
        atexit(newline);
    }
}

【讨论】:

  • 我认为我被否决是因为我没有打印尾随换行符?这不是一个要求。 ;-)
  • 但是为什么不让它也打印换行符呢?如果你这样做,我会 +1 你:P。
  • 请注意:C++ 中不允许递归调用main
  • 问题标记为 C,而不是 C++。
  • @Richard:您的 C 实现可能需要打印最后的换行符。我没有标准,但草案 n1256 (C99 + TC1 + TC2) 7.19.2p2 部分说明“最后一行是否需要终止换行符是实现定义的。”
【解决方案2】:

如果您的教授对您的表现进行评分,请在另一个问题中尝试ggf31416's solution 解决此问题:

int FastReverse(int num) {
    int res = 0;
    int q = (int)((214748365L * num) >> 31);
    int rm = num - 10 * q;
    num = q;
    if (rm == 0) return -1;
    res = res * 10 + rm;
    while (num > 0) {
       q = (int)((214748365L * num) >> 31);
       rm = num - 10 * q;
       num = q;
       res = res * 10 + rm;
    }
    return res;
}

优化®

绝对,肯定必须在这一纳秒内完成。

【讨论】:

  • 这伤害了我的眼睛。还赞成优化几乎不需要任何时间的东西。
  • 如果输入是 120,那么预期的输出是多少?我认为是 021 或 21。对于 1200 也是如此。当输入尾随 0 时,此算法是否会产生正确的结果?
  • @ArunSaha:给定原始算法的应用程序,当给定一个尾随零的数字时,它会快速退出。并且鉴于此处没有很好地定义尾随零的输入的预期输出,我认为这仍然是合理的行为。要消除这种行为,必须简单地注释掉if (rm == 0) return -1; 行。在这种情况下,给定 1200,它将返回 21。使用前导零进行格式化将是高阶函数的职责。
【解决方案3】:

使用% 10 获取最后一位数字。输出它。将数字除以 10 得到除最后一位以外的所有数字。使用% 10 获取最后一位数字。以此类推,直到数字变为0。

【讨论】:

  • char buf[12]; snprintf(buf, 16, "% 10d", n); for ( size_t i = 10; i --&gt; 0 &amp;&amp; buf[i] &gt; 42; ) printf("%c", buf[i]);
  • @Pete Kirkham:你在那里所做的事情既可爱又令人困惑。一开始会认为等等,C中没有“goes to”操作符
  • 我想要完整的 no 这将生成 no 12345 作为 5 4 3 2 1 但我想要 54321 竞争
【解决方案4】:

这是另一种可能性。它是非递归的,也许代码少一点。代码cmets中有一个例子来说明逻辑。

/*
    Example: input = 12345

    The following table shows the value of input and x
    at the end of iteration i (not in code) of while-loop.
    ----------------------
    i   |   input  |    x
    ----------------------
    0       12345       0
    1        1234       5
    2         123      54
    3          12     543
    4           1    5432
    5           0   54321
    ----------------------
*/
uint32_t
reverseIntegerDigits( uint32_t input )
{
    uint32_t x = 0;

    while( input )
    {
        x = 10 * x + ( input % 10 );
        input = input / 10;
    }

    return x;
}

【讨论】:

    【解决方案5】:

    使用scanf("%s", A) 或者更好的是使用fgets 读取字符数组A 中的数字,并通过输出从strlen(A) - 10 开始的每个字符来输出反转的字符数组。

    【讨论】:

      【解决方案6】:

      strrev 函数反转字符串。如果性能不是问题,那么例如您可以执行 itoa,然后是 strrev,然后是 atoi。 但是即使没有 strrev,任务也很简单。

      【讨论】:

      • 如果我没记错的话,strrev 不是标准函数,可能并非在所有编译器上都可用。
      • 是的,当然。在这种情况下,自己实现 strrev 会有所帮助。
      【解决方案7】:

      看起来像一个非常古老的线程。但是我在这里提到了解决方案,并且在测试了本网站上作为解决方案可用的不同程序之后,不得不编写自己的解决方案。我意识到如果数字以零结尾,将数字视为 int 不会产生必要的数字反转。所以我决定把这个数字当作一个字符串,然后把数字颠倒过来。这样,从字符串的角度来看,我得到了数字的精确反转,而不是在数字开头丢弃零的数学数字。

      #include <stdio.h>
      #include <string.h>
      
      main()
      {
      
          char num[20];
          int x=0,slen;
      
          printf("Enter the number you want to reverse :");
          scanf("%s",num);
          slen=strlen(num);
      
      
          char *pointertoarray = &num[slen];
      
          for (x=slen;x>=0; x--){ printf("%c",*pointertoarray); pointertoarray--; }
          printf("\n");
      
      }
      

      【讨论】:

        【解决方案8】:
        1. 计算number的位数并存储在count变量中
        2. 提取变量中的单个数字
        3. 使用幂函数。

          while(count>=1)
          {
            var = num % 10;
            sum = sum + var * pow(10, count - 1);
            num =num / 10;
            count--;
          }
          

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多