示例:
例如:给定数“456”,需返回“654”,给定“-876”,则需返回“-678”
注意:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。
解答:
看到题意,我们知道:
(1)注意 X 的 正负 ,(若为 负数 ,为了防止做除法时(向下取整),取其绝对值 ,)用一个数 记录 X的状态
(2)首先需要将给定的数 X 的个位、十位 分隔开,
(3)再将分隔开的 位数 翻转
(4)将翻转好的 位数 ,进行组合,组合成为一个新的 数
(5)此时,用(1)中 记录数 判断 X的状态
(6)检查 翻转 后的值 是否 溢出 (5)和(6)可互换
代码如下:
“标头.h”
#pragma once
#include<stdio.h>
#include<Windows.h>
#include<math.h>
int reverse(int x) {
//如果 -10 < x < 10 表明 x为个位数,无需翻转
if (x<10 && x >-10)
return x;
//翻转后的每一位存储位置
int kk[32] = { 0 };
int i = 0;
//y 为检验x 是正 是负
int y = 1;
//如果x为负,则使用其y 记录,用x的绝对值做运算
if (x<0)
{
y = x;
x = -1 * x;
}
// 计算出翻转后的位置,
for (i = 0; x>9; i++)
{
kk[i] = x % 10;
x = x / 10;
}
// 最后一位 记录 x 的 最高位
kk[i] = x;
int c = 0;
c = i;
int dd = 0;
int j = 0;
// 计算翻转后的数的大小( 前面单纯计算翻转后的每一位所在位置)
for (j = 0; j <= c; j++)
{
dd = dd + kk[i--] * pow(10, j);
}
// y 为检验数,若y <0 则表明 x 是复数,翻转后依旧
if (y<0)
dd = -1 * dd;
// 若 翻转后 32位数 溢出,则将翻转后的数,置为0
if (dd>pow(2, 31) || dd <= -1 * pow(2, 31))
dd = 0;
return dd;
}
void test()
{
int h[3] = { -9, 1534236469, 789 };
int i = 0;
for (i = 0; i < 3; i++)
{
int m = reverse(h[i]);
printf("\t原:%d \n\t现: %d \n ----------\n", h[i], m);
}
}
源文件:"main.c"
#include"标头.h"
int main()
{
test();
system("pause");
return 0;
}
程序结果如图: