在没有字符串或字符的帮助下找到数字的反向(例如:2500反向0025)

时间:2014-01-14 08:40:24

标签: c++ c

当最后有零时,是否有找到反向的技术。

在遵循%10技术的算法时,结果为52.并且缺少0。

我只需打印提醒(0为)即可。但我不满意,因为我希望将答案显示为变量中的值。

请告诉我是否有任何技术可以将值005存储到变量中并显示005(请不要使用字符串或字符或数组)。

4 个答案:

答案 0 :(得分:5)

您不能将具有前导零的整数表示为单个整数变量,该信息根本不是以整数分配位的方式的一部分。您必须使用更大的东西,即字符串或单个(小整数)数字的数组。

答案 1 :(得分:4)

数字存储为二进制0和1,因此它们总是具有被截断的前导0。例如64位整数具有64位位,始终,当打印时,这些前导0将被删除。

您需要知道要保留多少个前导零,并且在打印时只使用那么多。即,您可以记录正常数字中有多少前导零而不对其进行编码,例如通过在开始时添加1。即0052被记录为10052,您在打印时会跳过第一个数字。

如果您需要存储单个值,则可以执行以下操作。我使用do / while以便0变为10并打印为0。数字0是一个不会丢弃所有前导零的地方(否则它将为空)


这似乎是您想要的解决方案,它在C或C ++中应该基本相同

static long reverse(long num) {
    long rev = 1; // the 1 marks the start of the number.
    do {
        rev = rev * 10 + num % 10;
        num /= 10;
    } while(num != 0);
    return rev;
}

// make the reversed number printable.
static String toStringReversed(long num) {
    return Long.toString(num).substring(1);
}

long l = reverse(2500); // l = 10052

另一种方法是随时打印数字,因此无需存储它。

e.g。

static void printReverse(long l) {
    do {
        System.out.print(l % 10);
        l /= 10;
    } while(l != 0);
}

或者你可以让输入记录数字。

static void printReverse(long l, int digits) {
    for(int i = 0; i < digits; i++) {
        System.out.print(l % 10);
        l /= 10;
    }
}

// prints leading zero backwards as well
printReverse(2500, 6); // original number is 002500

打印

005200

答案 2 :(得分:0)

您无法将它们存储在简单的整数变量中,因为它采用二进制格式

00101与000101相同,与101相同,仅产生5个。十进制数和二进制数之间的转换不考虑前导零,因此不可能存储具有相同整数变量的前导零。

您可以打印它,但除非使用整数数组,否则无法存储前导零...

int num = 500;

while(num > 0)
{
    System.out.print(num%10);
    num = num/10;
}

或者,您可以将前导零的计数存储为单独的实体,并在需要使用时将它们组合在一起。如下所示。

int num = 12030;
boolean leading=true;
int leadingCounter = 0;
int rev = 0;
while(num > 0)
{
    int r = num%10;
    if(r == 0 && leading == true)
        leadingCounter++;
    else
        leading = false;
    rev = rev*10 + r;
    num = num/10;
}
for(int i = 1; i <= leadingCounter ; i++)
    System.out.print("0");
System.out.println(rev);

答案 3 :(得分:0)

我认为接受的答案是好的,因为它既反驳了错误的问题部分,也提供了可行的解决方案。但是,代码中存在所有Java,并且它不会暴露最漂亮的API。这是一个基于accepted answer的代码的C ++版本。

(哈哈,我所有的谈话,我的回答没有扭转字符串!最好的一天!)

回到学校并获得学位后,我想出了这个答案:它有一些可疑的“不使用字符串”或将任何值转换为字符串的说法。当然,无法避免字符,因为我们最终打印了这个值。

#include <ostream>
#include <iostream>

class ReverseLong {
  public:

    ReverseLong(long value) {
      long num = value;
      bool leading = true;
      this->value = 0;
      this->leading_zeros = 0;

      while (num != 0) {
        int digit = num % 10;
        num = num / 10;

        if (leading && digit == 0) {
          this->leading_zeros += 1;
        } else {
          this->value = this->value * 10 + digit;
          leading = false;
        }
      }
    };

    friend std::ostream & operator<<(std::ostream& out, ReverseLong const & r);

  private:
    long value;
    int leading_zeros;

};

std::ostream & operator<<(std::ostream& out, ReverseLong const & r) {

  for (int i =0; i < r.leading_zeros; i++) {
    out << 0;
  }

  out << r.value;

  return out;
};

int main () {
  ReverseLong f = ReverseLong(2500); // also works with numbers like "0"!

  std::cout << f << std::endl; / prints 0052
};