自以为C学得入门了,刷力扣一下子原形毕露。
整数反转,自己写不出来的核心原因
(1)反转关键算法不清楚
(2)整形的具体范围模糊
(1)思路,需要两个变量,一个是待处理的值,一个用来存放当前的反转后的值。
如何让反转的值“升位”,这是一个问题。其实方法也很简单,count 进行累乘后再相加这一部分代表对原先count的值进行进位。
另外一个是while循环条件问题,直接x!=0 就好了,不需要每种情况都想一遍,很der!
(2)其实,在现在的C编译器中,int 和 long 取值范围一样(起初int占用内存是2字节,现在是4字节)
但不代表他俩就一样,stackoverflow回答里截取一个比较满意的。
A brilliant feature of gcc is that even when "int" and "long" have the same representation, that doesn't mean an "int*" can update a "long", or a "long*" can update an "int", even if the pointers are cast through void*.
左半边2^31,
右半边2^31-1
int reverse(int x){
long count=0;
while(x!=0){
count=count*10+x%10;
x=x/10;
}
return count>2147483647||count<-2147483648?0:count;
}
```c
#define isOverLength 0
int reverse(int x){
long lRet = 0;
while(0 != x)
{
lRet = lRet * 10 + x % 10;
x = x / 10;
}
if((int)lRet != lRet)
{
return isOverLength;
}
return (int)lRet;
}
最后附上我自己尝试实现功能的代码吧,有点der,哈哈哈!
留个思考的纪念
#include <stdio.h>
#include <math.h>
int main()
{
long int a;
int count = 0;
int x = 3;
scanf("%d",&a);
if(a > 0)
{
x =1;
}
else if( a < 0)
{
x = 0;
}
a = abs(a);
if(x == 0)
{
printf("-");
}
while(a != 1 && a != 0)
{
count = a%10;
a /= 10;
if(count == 0)
{
continue;
}
else{
printf("%d",count);
}
}
printf("%d",a);
return 0;
}