神奇数


//这里的神奇数定义:数的所有位分成两组,2组数字的和相等
//规定负数不是神奇数

#include<iostream>
#include<algorithm>

using namespace std;
#define N 10
class Solution
{
public:
	//判断一个数是不是神奇数,负数不是神奇数
	bool isSubsetSplit( int number )
	{
		if( number < 11 )
			return false;

		int array[N]{ 0 };
		int sum = 0;
		int bits = 0;
		int halfSum = 0;

		while( number != 0 )
		{
			array[++bits] = number % 10;
			number /= 10;
			sum += array[bits];
		}
		array[0] = bits;
		if( sum % 2 == 1 )
			return false;
		else
		{
			sort( &array[1], &array[bits + 1] );
			do
			{
				halfSum = 0;
				for( int i = 1; i <= bits; i++ )
				{
					halfSum += array[i];
					if( halfSum * 2 == sum )
						return true;
					if( halfSum * 2 > sum )
						break;
				}
			}
			while( next_permutation( &array[1], &array[bits + 1] ) );
		}
		return false;
	}
	//[l,r]范围内的神奇数个数
	int countMagicNumberBetween( int l, int r )
	{
		if( r <= 10 || r < l )
			return 0;

		l = max( 11, l );
		int count = 0;
		for( int i = l; i <= r; i++ )
		{
			if( isSubsetSplit( i ) )
				count++;
		}
		return count;
	}
};

int main( )
{
	Solution s;
	int l, r;
	while( true )
	{
		cin >> l;
		cin >> r;
		cout << s.countMagicNumberBetween( l, r ) << endl;
	}
	system( "pause" );
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值