题目:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
解答:
#define MIN -2147483648
#define MAX 2147483647
int reverse(int x){
int i=0,j,t;
long int tmp=x,sum=0;
while(tmp){
tmp=tmp/10;
i++;
}
tmp=x;
for(j=1;j<=i;j++)
{
t=tmp/(int)(pow(10,j-1))%10;
if(t==0&&j==1)
continue;
sum+=t*(long int)(pow(10,i-j));
}
if(sum>=MIN && sum<=MAX)
return sum;
else
return 0;
}
解题思路:
①首先得判断这个数到底有几位
用一个while语句
while(tmp){
tmp=tmp/10;
i++;
}
tmp每除一次10,i加1,循环结束i的值为这个数的位数。
②知道位数后,需要计算这个数每一位的值,以及反转后的值,还要注意是否存第一位为0情况。如果出现第一位为0,则终止本次循环(不终止整个循环)。
for(j=1;j<=i;j++)
{
t=tmp/(int)(pow(10,j-1))%10;
if(t==0&&j==1)
continue;
sum+=t*(long int)(pow(10,i-j));
}
③判断数据是否溢出
注意long int的数据范围是:-2147483648~ 2147483647
if(sum>=MIN && sum<=MAX)
完整代码可以这样写:
#include<stdio.h>
#include<math.h>
//long int数据范围-2147483648~ 2147483647
#define MIN -2147483648
#define MAX 2147483647
int reverse(int x){
int i=0,j,t;
long int tmp=x,sum=0;
//判断这个数有几位,
while(tmp){
tmp=tmp/10;//每次除以10
i++;//i每次加1
}
tmp=x;把原来的数赋值给tmp
for(j=1;j<=i;j++)
{
t=tmp/(int)(pow(10,j-1))%10;//计算得到原始数每一位的值,通过取余数
if(t==0&&j==1)//判断第一位是否为0,如果为0终止此次循环
continue;
sum+=t*(long int)(pow(10,i-j));//计算反转后的值
}
if(sum>=MIN && sum<=MAX)//判断数据是否溢出
printf("%ld\n",sum);//打印反转后的数
else
return 0;
}
int main()
{
int a;
scanf("%d",&a);//输入原始数据
reverse(a);
return 0;
}