P1307 [NOIP2011 普及组] 数字反转 题解

题目描述

给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。

输入格式

一个整数 N

输出格式

一个整数,表示反转后的新数。

输入 1

123

输出1

321

输入2

-380

输出2

-83

代码:

#include 
#include
using namespace std;
int main() 
{
	int n;
	cin >> n;
	char a[1000000];
	int k = 0;//用于帮助将数字转换为字符串
	if (n > 0) //当n>0,将数字转换为字符串
	{
		while (n > 0)
		{
			a[k++] = char(n % 10 + '0');
			n /= 10;
		}
	}
	else if (n < 0)
	{
		a[k++] = '-';
		int c = abs(n);
		while (c > 0)
		{
			a[k++] = char(c % 10 + '0');
			c = c / 10;
		}
	}
	a[k] = '\0';
	int count = 0;//用于帮助处理开头的0,当count=1时并且a[i] == 0时,直接continue
	for (int i = 0; i < k; i++)
	{
		if (count == 1 && a[i] == '0')
			continue;
			cout << a[i];
		count++;
	}
	return 0;
}

不知道为什么在洛谷测试只有70分,要是有大佬愿意看看我真的是万分感谢!

代码二:

在洛谷看到一个很聪明的解法,记录一下,大概的思路是如果输入的是负数,那就先处理好负数的问题,先将负号打印,然后再把负数转化为正数,然后都是正数处理,就简单许多了

#include 
#include
using namespace std;
#include

int main() 
{
	int n; cin >> n;
	if (n < 0) 
	{
		cout << "-";
		n = -n;//不管正负数,都转成正数方便操作,如果是负数,先输出一个负号
	}
	while (n % 10 == 0)n /= 10;
	//此时就可以把n当正数打印即可
	int k = 0;
	char a[100000];
	while (n > 0)
	{
		a[k++] = char(n % 10 + '0');
		n /= 10;
	}
	a[k] = '\0';
	for (int i = 0; i < k; i++) {
		cout << a[i];
	}
	return 0;
}

你可能感兴趣的:(洛谷,字符串)