C 格式说明符和反转32位有符号整数

C 格式说明符和反转32位有符号整数,c,C,在一次访谈中,我得到了一个代码,用来编写一个函数来反转一个32位有符号整数,我在第三次尝试中编写了这个代码(与所有测试用例一起使用): intfun(intx) { 字符a[11]=“”;//这将包含数字“x”的绝对值的字符形式 char b[11]=“”;//这将包含绝对数“x”的倒数 字符e[11]=“”; 短符号=-1; 短指数_a=0; 短指数_b=0; 短指数_e=0; 短期温度指数=0; if(x0) { sprintf(a,“%u”,(无符号整数)x); sprintf(e,“%u

在一次访谈中,我得到了一个代码,用来编写一个函数来反转一个32位有符号整数,我在第三次尝试中编写了这个代码(与所有测试用例一起使用):

intfun(intx)
{
字符a[11]=“”;//这将包含数字“x”的绝对值的字符形式
char b[11]=“”;//这将包含绝对数“x”的倒数
字符e[11]=“”;
短符号=-1;
短指数_a=0;
短指数_b=0;
短指数_e=0;
短期温度指数=0;
if(x0)
{
sprintf(a,“%u”,(无符号整数)x);
sprintf(e,“%u”,(无符号整数)(-1*(长整数)(pow(2,31)-1));//设置限制
符号=1;
}
其他的
x=0;
指数a=strlen(a);
--指数a;
//“b”将包含数组“a”的反向数字
while(index_a>=0)//按相反顺序逐个字符将其存储在“b”中
{
b[index_b++]=a[index_a--];
}
//这里索引_a等于-1,索引_b等于'strlen(b)'
if(index_b==10)//10是(2^31-1)或(2^31)中的位数
{
while(临时索引[索引])
返回0;
else if(b[temp_index]
我被要求提高,但我不能(后来才知道这个问题是为了过滤——我想我失败了)——你能建议其他方法吗

我面临的主要问题是当变量x等于-(2^31)时,这就是为什么我不能简单地编写
x=abs(x)
-你能给我推荐一些链接,让我深入阅读有符号无符号限制和格式说明符吗(%l不能与
sprintf
一起使用,因此使用了
%u

约束-

  • 如果发生溢流/下溢,则返回0

  • 返回类型固定为int

  • 参数的数量是固定的

如果要将其反转为十进制数:

三个版本

int reverse10(int val)
{
    long long result = 0 ;

    while(val)
    {
        result *= 10;
        result += val % 10;
        val /= 10;
    }
    if(result < INT_MIN || result > INT_MAX) return 0;
    return result;
}

int rev(int32_t val, int32_t *result)
{
    int32_t temp;
    int digit;
    *result = 0;

    while(val)
    {
        temp = *result;
        *result *= 10;
        if(temp != (*result / 10)) {*result = 0; return -1;}
        temp = *result;
        digit = val % 10;
        *result += digit;
        if(temp != (*result - digit)) {*result = 0; return -1;}
        val /= 10;
    }
    return 0;
}

int rev1(int val)
{
    int temp;
    int digit;
    int result = 0;

    while(val)
    {
        temp = result;
        result *= 10;
        if(temp != (result / 10)) return 0;
        temp = *result;
        digit = val % 10;
        result += digit;
        if(temp != (result - digit)) return 0;
        val /= 10;
    }
    return result;
}
int反转10(int val)
{
长结果=0;
while(val)
{
结果*=10;
结果+=val%10;
val/=10;
}
if(resultINT_MAX)返回0;
返回结果;
}
int rev(int32_t val,int32_t*结果)
{
内部温度;
整数位数;
*结果=0;
while(val)
{
温度=*结果;
*结果*=10;
如果(temp!=(*result/10)){*result=0;返回-1;}
温度=*结果;
数字=val%10;
*结果+=位数;
如果(temp!=(*result-digit)){*result=0;返回-1;}
val/=10;
}
返回0;
}
内部版本1(内部版本)
{
内部温度;
整数位数;
int结果=0;
while(val)
{
温度=结果;
结果*=10;
如果(温度!=(结果/10))返回0;
温度=*结果;
数字=val%10;
结果+=位数;
如果(温度!=(结果-数字))返回0;
val/=10;
}
返回结果;
}

如果我看到这样的东西
pow(2,31)
我知道我不应该雇用这个家伙。一个简单的请求需要这么多代码。将其视为未签名,for loop all sizeof(int)位,用&和|获取低位到新变量。将输入和新变量向相反方向移位直到完成。还有两个幻数异或,可以用来更快地反转,或者使用内部rev指令(如果存在)。您可以使用INT32_MAX和INT32_MIN。您可以避免使用3个字符串缓冲区,只使用1个,也可以进行混响通过迭代到字符串的一半,将前面的字符替换为后面的字符,来转换字符串。更重要的是,您可以添加文档和注释来解释角大小写是什么。@MichaelDorgan:问题不在于位的反转。问题是产生由十进制数字的反转表示的数字。@EricPostDischil,assigning从无符号值到有符号值的转换充满了perl。从提供的代码中可以明显看出,这个问题有处理溢出的要求,而这个答案并不能满足这一点。@EricPostFischil实际上没有。我问了类似的问题,看看受访者是否理解这个问题。面试问题必须非常简单,但说明了这一点方法因为人们通常压力很大,必须考虑到accountreturn类型是固定的-intStill,mod div 10也是我的方法。@AgrudgeAmicus我看这里没有错-UV。如果代码必须返回一个
int
,在函数末尾测试结果是否在[int\u MIN…int\u MAX]范围内并根据需要处理超出范围的答案。
int reverse10(int val)
{
    long long result = 0 ;

    while(val)
    {
        result *= 10;
        result += val % 10;
        val /= 10;
    }
    if(result < INT_MIN || result > INT_MAX) return 0;
    return result;
}

int rev(int32_t val, int32_t *result)
{
    int32_t temp;
    int digit;
    *result = 0;

    while(val)
    {
        temp = *result;
        *result *= 10;
        if(temp != (*result / 10)) {*result = 0; return -1;}
        temp = *result;
        digit = val % 10;
        *result += digit;
        if(temp != (*result - digit)) {*result = 0; return -1;}
        val /= 10;
    }
    return 0;
}

int rev1(int val)
{
    int temp;
    int digit;
    int result = 0;

    while(val)
    {
        temp = result;
        result *= 10;
        if(temp != (result / 10)) return 0;
        temp = *result;
        digit = val % 10;
        result += digit;
        if(temp != (result - digit)) return 0;
        val /= 10;
    }
    return result;
}