反转199以上的整数

问题描述 投票:0回答:2

我正在解决 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
,但为什么会发生这种情况?是否有任何替代解决方案?

c integer reverse
2个回答
2
投票

您的代码不起作用,因为测试

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;
}

1
投票

问题出在声明中:

while(x/t>1)

您筹集的

y
超出了适合您算法的算力。

如果你像这样改变条件,它应该会起作用:

while(x/t>=10)

这是一个替代解决方案,它比您想要做的简单得多。

步骤:

  • 1 - 提取右侧第一个数字。
  • 2 - 将其乘以 10 并将其添加到反向变量中,就像将其推到左侧一样。
  • 3 - 将您的号码除以 10 以删除您刚刚使用的数字。
  • 4 - 重复,直到您的数字等于 0
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.