4.4 课后习题与实验(2)

习题 4-3

P1307 [NOIP2011 普及组] 数字反转
noip2011普及组第一题

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

输入格式

一个整数 NN

输出格式

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

输入输出样例

输入 输出
123 321
-380 -83

说明/提示

数据范围
−1,000,000,000 ≤ N ≤ 1,000,000,000

解答

规规矩矩的判断:

#include<iostream>
using namespace std;

int main()
{
	int a,s=0;
	cin>>a;
	
	int a1000000000 = a/1000000000;
	int a100000000 = a%1000000000/100000000;
	int a10000000 = a%100000000/10000000;
	int a1000000 = a%10000000/1000000;
	int a100000 = a%1000000/100000;
	int a10000 = a%100000/10000;
	int a1000 = a%10000/1000;
	int a100 = a%1000/100;
	int a10 = a%100/10;
	int a1 = a%10;
	
	if(a>=1000000000 || a<=-1000000000)
	{
		s+=a1*1000000000;
		s+=a10*100000000;
		s+=a100*10000000;
		s+=a1000*1000000;
		s+=a10000*100000;
		s+=a100000*10000;
		s+=a1000000*1000;
		s+=a10000000*100;
		s+=a100000000*10;
		s+=a1000000000;
	}
	else if(a>=100000000 || a<=-100000000)
	{
		s+=a1*100000000;
		s+=a10*10000000;
		s+=a100*1000000;
		s+=a1000*100000;
		s+=a10000*10000;
		s+=a100000*1000;
		s+=a1000000*100;
		s+=a10000000*10;
		s+=a100000000;
	}
	else if(a>=10000000 || a<=-10000000)
	{
		s+=a1*10000000;
		s+=a10*1000000;
		s+=a100*100000;
		s+=a1000*10000;
		s+=a10000*1000;
		s+=a100000*100;
		s+=a1000000*10;
		s+=a10000000;
	}
	else if(a>=1000000 || a<=-1000000)
	{
		s+=a1*1000000;
		s+=a10*100000;
		s+=a100*10000;
		s+=a1000*1000;
		s+=a10000*100;
		s+=a100000*10;
		s+=a1000000;
	}
	else if(a>=100000 || a<=-100000)
	{
		s+=a1*100000;
		s+=a10*10000;
		s+=a100*1000;
		s+=a1000*100;
		s+=a10000*10;
		s+=a100000;
	}
	else if(a>=10000 || a<=-10000)
	{
		s+=a1*10000;
		s+=a10*1000;
		s+=a100*100;
		s+=a1000*10;
		s+=a10000;
	}
	else if(a>=1000 || a<=-1000)
	{
		s+=a1*1000;
		s+=a10*100;
		s+=a100*10;
		s+=a1000;
	}
	else if(a>=100 || a<=-100)
	{
		s+=a1*100;
		s+=a10*10;
		s+=a100;
	}
	else if(a>=10 || a<=-10)
	{
		s+=a1*10;
		s+=a10;
	}
	else
	{
		s+=a1;
	}

	cout<<s;
	return 0;
} 

解法二:

#include<iostream>
using namespace std;

int main()
{
	int a,flag=0,s=0;
	cin>>a;
	
	if(a<0) //如果是负数,先输出负号,并转换成正数
	{
		cout<<'-';
		a=0-a;
	}
	
	
	while(a>0) 
	{
		s=a%10; //取个位
		
		if(s>0&&flag==0) //判断是否需要输出,首位非0数字后的数字才需要输出
			flag=1;
		
		if(flag==1)
			cout<<s;
			
		a/=10; //升位,十位升为个位,准备下一轮循环
	}
	return 0;
} 

解法三:

#include<iostream>
using namespace std;

int main()
{
	int a,flag=0,s=0;
	cin>>a;
	
	if(a<0)
	{
		cout<<'-';
		a=0-a;
	}
	
	while(a%10==0) //除掉数字后边的0
	{
		a/=10;
	}
	
	while(a>0) //反向输出
	{
		cout<<a%10;	
		a/=10;
	}
	return 0;
} 
posted @ 2021-04-30 11:48  CodeSpark  阅读(126)  评论(0)    收藏  举报