洛谷—P1307 数字反转

题目描述

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

输入输出格式

输入格式:

 

一个整数 NN

 

输出格式:

 

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

 

输入输出样例

输入样例#1: 复制

123

输出样例#1: 复制

321

输入样例#2: 复制

-380

输出样例#2: 复制

-83

说明

数据范围

-1,000,000,000≤N≤1,000,000,000−1,000,000,000≤N≤1,000,000,000。

noip2011普及组第一题

 

得分:70 

3个点WA了  目前还没排查出来... 感觉自己思路好复杂

#include 
#include 
#include 

using namespace std;

typedef long long ll;



int main()
{
	string s;
	bool flagFu = false, flag0 = false; // 负数标志
	cin >> s;
	if(s[0] == '-') //如果是负数
	{
		flagFu = true;
	}
	if(s[s.size()-1] == '0')
	{
		flag0 = true;
	}
	if(flagFu&&!flag0)
	{
		for(int i = 1; i <= s.size()/2; i++)
		{
			char t = s[i];
			s[i] = s[s.size()-i];
			s[s.size()-i] = t;
		}
		printf("%s", s.c_str());
	}else if(flagFu&&flag0)
	{
		int pos, pp=0;
		for(int i = s.size()-1; i > 0; i--)
		{
			if(s[i] == '0') continue;
			else
			{
				pos = pp = i;
				break;
			}
		}
		for(int i = 1; i <= pos/2+1; i++)
		{
			char t = s[i];
			s[i] = s[pos--];
			s[pos+1] = t;
		}
		for(int i = 0; i <= pp; i++)
		{
			printf("%c", s[i]);
		}
	}else if(flag0&&!flagFu)
	{
		int pos, pp=0;
		for(int i = s.size()-1; i >= 0; i--)
		{
			if(s[i] == '0') continue;
			else
			{
				pos = pp = i;
				break;
			}
		}
		for(int i = 0; i <= pos/2+1; i++)
		{
			char t = s[i];
			s[i] = s[pos--];
			s[pos+1] = t;
		}
		for(int i = 0; i <= pp; i++)
		{
			printf("%c", s[i]);
		}
	}else if(!flagFu&&!flag0)
	{
		for(int i = 0; i <= s.size()/2; i++)
		{
			char t = s[i];
			s[i] = s[s.size() - 1 - i];
			s[s.size() - 1 - i] = t;
		}
		printf("%s", s.c_str());
	}
	
	return 0;
}

 

别人AC代码:

作者:洛谷---God·Hero

#include 
using namespace std;
long long n,k;//反转前的数和反转后的数
int main()
{
	cin >> n;
	while(n) //处理完了吗
	{
		k = k * 10 + n % 10;//k已有的值*10腾出一个零欢迎新来的小弟
		n /= 10;//凄凉啊,又有人背叛了我,扔掉已经加上的那一位
	}
	cout << k << endl;
}

短小精悍....通俗易懂!

 

感悟:思维这个东西真的挺重要,解决问题的算法不止一种,但计算机系的学生就是要找最好最快的一种。

我好笨啊...

你可能感兴趣的:(洛谷,反复看)