整数包括正数和负数,因此反转数字时应考虑的第一个问题---即为正负号反转后的情况。
整数中存在某些数字如(380,870)以0结尾的数字反转之后如果不加以讨论则是(083,078)等无效数字,因此产生了第二个问题-----即为个位数零号的省略。
第一个问题十分简单,直接一个if判断语句就可以了。第二个问题则有点复杂,我们这里采用了两种算法:1)标记控制输出法,2)除法分解数法。
---------------------------------------------------------------------------------------------------------------------------------
(1)标记控制输出法
我们把反转求的数字是从个位数开始,因此如果从个位数开始的数字一直是0则不需要反转过来,但是不仅仅是个位数可能出现0会影响我们反转,还有(例如:870,8700,87000)等数,他们的特点就是一旦出现反转数字有>0的时候,我们便需要考虑输出0这个地方,因此此时引入一个标记变量,来作为输出和不输出的地方。
#include<stdio.h>
int main() {
int a;
void ret(int n);
scanf("%d", &a);
ret(a);
return 0;
}
void ret(int n) {
int k=0,i=0;
if (n < 0) {
n = (-n);
printf("-");
}
for (i = 0; i <= 9 && n > 1; i++) {
if (n % 10 != 0) {
k= 1;
}
if ( k>0) {
printf("%d", n % 10);
}
n = n / 10;
}
}
该代码中k=0或者是k=1即为标记点,如果k=1则说明反转的数已经出现数字,需要把后面的0算在反转数中。(其中用递归的方式也可以完成)
其中n%10即每次取数字的个位数,这样一个一个取下来,第一个算法就到此结束。
---------------------------------------------------------------------------------------------------------------------------------
(2)除法分解数法
如果将每次剥下来的数字自行组成反转数字,则需要将剥下来的数字放入反转数,反转数的上一位数字往前进一位。进一位则用inversion*10+i(剥下来的数),这样如果inversion是0,再乘以10都是0,这样就有效的解决了第二个问题。
#include<stdio.h>//除法分解数
int main() {
int res=0;//反转的数
int i=0;
int n;//输入的数
scanf("%d\n", &n);
if (n < 0) {
n = -n;
printf("-");
}
while (n != 0) {
i = n % 10;
res = res * 10 + i;
n = n / 10;
}
printf("%d", res);
return 0;
}
就这样第二个算法结束。
加油学下去!向更深层次的编程水平看齐!