//这里的神奇数定义:数的所有位分成两组,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;
}
神奇数
最新推荐文章于 2018-08-21 22:42:26 发布