当最后有零时,是否有找到反向的技术。
在遵循%10技术的算法时,结果为52.并且缺少0。
我只需打印提醒(0为)即可。但我不满意,因为我希望将答案显示为变量中的值。
请告诉我是否有任何技术可以将值005存储到变量中并显示005(请不要使用字符串或字符或数组)。
答案 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
};