解决整数合理反转问题

整数包括正数和负数,因此反转数字时应考虑的第一个问题---即为正负号反转后的情况。

整数中存在某些数字如(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;
}

就这样第二个算法结束。

加油学下去!向更深层次的编程水平看齐!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值