我正在解决 C 中的一个问题,该问题反转提供给它的整数。
代码:
int reverse(int x) {
int i, t = 1, y = 0, neg = 0;
if (x < 0) {
neg = 1;
x = -1 * x;
}
while (x / t > 1) {
t = t * 10;
}
int p = t;
while (t >= 1) {
int d = x / t;
y = y + p * d / t;
x = x - d * t;
t = t / 10;
}
if (neg == 1) {
y = -1 * y;
}
return y;
}
由于某种原因,如果
x
结束了 199
,程序将无法正常工作。
在第一个
while
循环中,它将 d
作为 0
,因此在反转整数的末尾添加了一个额外的 0
。
我知道如果输入超过
10
,我可以将其编码为除以200
,但为什么会发生这种情况?是否有任何替代解决方案?
您的代码不起作用,因为测试
while (x / t > 1)
不正确。你应该这样写:
while (x / t > 9)
但请注意,您的方法很复杂。您从最低有效数字开始计算反转数,而不是从最高有效数字开始:
int reverse(int x) {
int y = 0, neg = 0;
if (x < 0) {
neg = 1;
x = -x;
}
while (x > 0) {
y = y * 10 + x % 10;
x = x / 10;
}
if (neg) {
y = -y;
}
return y;
}
此函数可以进一步简化,因为在 C 中整数除法始终向零截断,因此对于
x % 10
的负值,模 (x
) 数字为负数或零。
这是简化版本:
int reverse(int x) {
int y = 0;
while (x != 0) {
y = y * 10 + x % 10;
x = x / 10;
}
return y;
}
问题出在声明中:
while(x/t>1)
您筹集的
y
超出了适合您算法的算力。
如果你像这样改变条件,它应该会起作用:
while(x/t>=10)
这是一个替代解决方案,它比您想要做的简单得多。
步骤:
long reverse_modified(long number)
{
long rem =0 , reversed = 0;
/*4*/while (number != 0)
{
/*1*/rem = number % 10;
/*2*/reversed = reversed * 10 + rem;
/*3*/number /= 10;
}
return reversed;
}