京东笔试题 神奇数

先吐槽一下CSDN编辑器,编辑了半天,一个ctr+z,居然全没有了,重新写给定整数区间,找其中的神奇数个数,因此最核心的是写一个判定是否是神奇数的函数。下面只介绍怎么判定是否是神奇数。


神奇数定义:一个数各个数位的数字可以分为和相等的两组,则为神奇数。如242这个数,各个数位数字为{2,4,2},可以分为{2,2}和{4}两组,且和都为4,所以是神奇数。


思路:当需要排列组合却很麻烦,不能有两三个for循环写出来,或者循环嵌套次数不确定时。绞尽脑汁想不出来好办法,那就用递归大法吧。代码如下:

#include 
#include
#include 
#include
#include
#include
using namespace std;
bool isMagic(int target,vector &num);
int main() {
    int num;
	while(1){
		cin >> num;
		vector numVec;
		int sum = 0;
		while(num > 0){//快速将数字转化为数组
			sum += num % 10;
			numVec.push_back(num % 10);
			num /= 10;
		}
		sum = accumulate(numVec.begin(),numVec.end(),0);
		if(sum % 2 > 0){//如果和是奇数,则肯定不是神奇数
			cout << "不是神奇数" << endl;
			system("pause");
		}
		else{
		   int half = sum / 2;//和的一半
		   if(isMagic(half,numVec))
			   cout << "是神奇数" << endl;
		   else
			   cout <<  "不是神奇数" << endl;
		   system("pause");
		}
	   
	}
	
    return 0;   

	
}
bool isMagic(int target,vector &num){//递归函数
	int len = num.size();
	if(target == 0 && len > 0)//说明已经找到一个分组,使得和为half
		return true;
	if(target < 0)//这种组合找不到了
		return false;
	bool result = false;
	for(int i = 0; i < len; ++i){
		vector numTmp = num;
		vector::iterator it = numTmp.begin() + i;
		numTmp.erase(it);
		result = result || isMagic(target - num[i],numTmp);//用||,是因为底层递归函数返回找到,则找到了
		if(result)
			break;
	}
	return result;
}


结果:

224
是神奇数
请按任意键继续. . .
12
不是神奇数
请按任意键继续. . .
112
是神奇数
请按任意键继续. . .
121
是神奇数
请按任意键继续. . .
2341
是神奇数
请按任意键继续. . .
1234567890
不是神奇数
请按任意键继续. . .
31265487
是神奇数
请按任意键继续. . .
1
不是神奇数





你可能感兴趣的:(笔试题总结)