蓝桥杯-基础练习之特殊回文数——BASIC-9

基础练习 特殊回文数  
时间限制:1.0s   内存限制:512.0MB
   
问题描述
  123321是一个非常特殊的数,它从左边读和从右边读是一样的。
  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
输入格式
  输入一行,包含一个正整数n。
输出格式
  按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
  1<=n<=54。

直观一点的,这个多加了一条剪枝,如果是五位数,在第一位数确定后 n-第一位数差不得大于 36,因为后面四位数最大为9999 所以不能大于36,其他几位数如是

// 特殊回文数

#include <iostream>


using namespace std;

int n;
int f[5],s[6];
bool judge(int ws,int no)
{
	int i,sum=0;
	if(ws==5)
	{
		if(no==1)
		{
			if(n-f[0]>36 || n-f[0]<0)	return 0;
		}
		else if(no==2)
		{
			for(i=0;i<no;++i)	sum+=f[i];
			if(n-sum>27 || n-sum<0)	return 0;
		}
		else if(no==3)
		{
			for(i=0;i<no;++i)	sum+=f[i];
			if(n-sum>18 || n-sum<0)	return 0;
		}
		else if(no==4)
		{
			if(f[3]!=f[1])	return 0;
			for(i=0;i<no;++i)	sum+=f[i];
			if(n-sum>9 || n-sum<0)	return 0;
		}
		else
		{
			if(f[4]!=f[0])	return 0;
			for(i=0;i<no;++i)	sum+=f[i];
			if(sum!=n)	return 0;
		}

	}

	else
	{
		if(no==1)
		{
			if(n-s[0]>45 || n-s[0]<0)	return 0;
		}
		else if(no==2)
		{
			for(i=0;i<no;++i)	sum+=s[i];
			if(n-sum>36 || n-sum<0)	return 0;
		}
		else if(no==3)
		{
			for(i=0;i<no;++i)	sum+=s[i];
			if(n-sum>27 || n-sum<0)	return 0;
		}
		else if(no==4)
		{
			if(s[3]!=s[2])	return 0;
			for(i=0;i<no;++i)	sum+=s[i];
			if(n-sum>18 || n-sum<0)	return 0;
		}
		else if(no==5)
		{
			if(s[4]!=s[1])	return 0;
			for(i=0;i<no;++i)	sum+=s[i];
			if(n-sum>9 || n-sum<0)	return 0;
		}
		else
		{
			if(s[5]!=s[0])	return 0;
			for(i=0;i<no;++i)	sum+=s[i];
			if(sum!=n)	return 0;
		}

	}
}

int main()
{
	int i,j,k;

	while(cin>>n)
	{
		
		for(f[0]=1;f[0]<10;++f[0])
		{
			if(!judge(5,1))	continue;
			for(f[1]=0;f[1]<10;++f[1])
			{
				if(!judge(5,2))	continue;
				for(f[2]=0;f[2]<10;++f[2])
				{
					if(!judge(5,3))	continue;
					for(f[3]=0;f[3]<10;++f[3])
					{
						if(!judge(5,4))	continue;
						for(f[4]=0;f[4]<10;++f[4])
						{
							if(!judge(5,5))	continue;
							for(i=0;i<5;++i)
								cout<<f[i];
							cout<<endl;
						}
					}
				}
			}
		}

		for(s[0]=1;s[0]<10;++s[0])
		{
			if(!judge(6,1))	continue;
			for(s[1]=0;s[1]<10;++s[1])
			{
				if(!judge(6,2))	continue;
				for(s[2]=0;s[2]<10;++s[2])
				{
					if(!judge(6,3))	continue;
					for(s[3]=0;s[3]<10;++s[3])
					{
						if(!judge(6,4))	continue;
						for(s[4]=0;s[4]<10;++s[4])
						{
							if(!judge(6,5))	continue;
							for(s[5]=0;s[5]<10;++s[5])
							{
								if(!judge(6,6))	continue;
								for(i=0;i<6;++i)
									cout<<s[i];
								cout<<endl;
							}
						}
					}
				}
			}					
		}
		
		
	}
	return 0;
}

优化后的:
#include <iostream>
using namespace std;
int arr[7],i;

bool isreturn(int num)
{
	// 判断它是五位还是六位
	if(i%2==0)
	{
		if(arr[0]==arr[4] && arr[1]==arr[3])	return 1;
		return 0;
	}
	else
	{
		if(arr[0]==arr[5] && arr[1]==arr[4] && arr[2]==arr[3])	return 1;
		return 0;
	}


}


bool isequal(int num,int n)
{
	int s=0;
	// 数分别存储
	i=0;
	while(num/10>0)
	{
		arr[i]=num%10;
		num/=10;
		s+=arr[i];
		++i;
	}
	arr[i]=num;
	s+=num;
	return n==s;
}


int main()
{
	int num,n;
	
	while(cin>>n)
	{
		for(num=10000;num<1000000;++num)
			if(isequal(num,n))
				if(isreturn(num))
					cout<<num<<endl;
	}
	
	return 0;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值