假设有一个数字被称为开心,如果有任何数字加减的组合,那么结果是42.
例如:
9999993,999399和399999很高兴,因为9 + 9 + 9 + 9 + 9 - 3 = 42
3783985861也很高兴,因为:3 + 7 + 8 - 3 + 9 + 8 - 5 + 8 + 6 + 1 = 42在C中添加和减去特定值的数字的组合
我的想法:
- 计数给定的数字有多长
- 数组合:2^n种组合| N =号码长度
- for循环,并检查所有的组合,以使结果是42 但如何?????
- 做递归。我可以通过添加所有数字来完成。但如何检查所有 组合?
int isHappy(unsigned int aNum){
int count = 0;
while(aNum != 0){
aNum /= 10;
count++;
}
int nTimes = 1;
for(int i=0;i<count;i++){
nTimes = nTimes * 2;
}
for(int i=0;i<nTimes;i++){
????
}
return nTimes;
}
int main(){
printf("%d", isHappy(999993));
return 0;
}
每位数有两种可能的迹象的和辅助功能。给你一个漂亮的二叉树,你可以遍历和回溯递归。 –
使用动态编程可以实现O(n^2)解决方案。想想是否有可能获得特定的前几位数字的加/减法。创建一个二维数组索引的数字位数和结果。(实际上编辑:O(n^2)) –
只是为了好玩,请注意整数* x *的base- * b *表示中的位数是O(log * x *),对于任何* b * 。因此,如何描述问题的渐近复杂性很大程度上取决于您如何定义问题的大小。 –