您的位置:首页 > 其它

神奇数

2017-09-09 22:51 155 查看
//这里的神奇数定义:数的所有位分成两组,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
{ 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: