京东笔试题 神奇数

来源:互联网 发布:java线程池下载多任务 编辑:程序博客网 时间:2024/05/21 14:47
先吐槽一下CSDN编辑器,编辑了半天,一个ctr+z,居然全没有了,重新写给定整数区间,找其中的神奇数个数,因此最核心的是写一个判定是否是神奇数的函数。下面只介绍怎么判定是否是神奇数。


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


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

#include <iostream>#include<cmath>#include <iostream>#include<string>#include<algorithm>#include<numeric>using namespace std;bool isMagic(int target,vector<int> &num);int main() {    int num;while(1){cin >> num;vector<int> 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<int> &num){//递归函数int len = num.size();if(target == 0 && len > 0)//说明已经找到一个分组,使得和为halfreturn true;if(target < 0)//这种组合找不到了return false;bool result = false;for(int i = 0; i < len; ++i){vector<int> numTmp = num;vector<int>::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
不是神奇数




原创粉丝点击