我想检查签名的int值x的反向是否位于INT_MAX和INT_MIN中。为此,我反转了两次x,并检查它是否等于原始的x,如果是,那么它位于INT_MAX和INT_MIN中,否则就不会。
但是在线编译器给出了一个运行时错误,但是我的g++编译器工作正常,并给出了正确的输出。有人能告诉我原因吗?
int reverse(int x) {
int tx=x,rx=0,ans;
while(tx!=0){
rx = rx+rx+rx+rx+rx+rx+rx+rx+rx+rx+tx%10;
tx/=10;
}
ans = tx = rx;
rx=0;
while(tx!=0){
rx = rx*10 + tx%10;
tx/=10;
}
while(x%10==0&&x!=0)x/=10;
//triming trailing zeros
if(rx!=x){
return 0;
}else{
return ans;
}
}错误:
Line 6: Char 23: runtime error: signed integer overflow: 1929264870 + 964632435 cannot be represented in type 'int' (solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:15:23发布于 2022-06-13 02:48:32
我不知道你的算法出了什么问题,但让我提出一个替代方案,避免做数学运算,避免整数溢出的可能性。
如果您想要找到If,比方说,当反转时2147483641是一个有效的整数(例如,1463847412),那么在将初始值转换为字符串并反转该字符串之后,您完全可以作为字符串进行比较。
一个非负值的基本算法它如下:
s)max_s)s.适当处理前导零和负值字符。即,120反转为"21“,-456反转为"-654”。此转换的结果是一个名为rev的字符串。rev.length() < s_max.length(),那么rev作为整数是有效的。rev.length() > s_max.length(),则rev作为整数无效。rev.size() == s_max.length(),则反向字符串与INT_MAX的长度与字符串相同。词汇比较就足以判断它是否有效。那是isValid = (rev <= s_max)或isValid = strcmp(rev, s_max) < 1除将INT_MAX替换为INT_MIN外,负值算法是相同的。
https://stackoverflow.com/questions/72596915
复制相似问题