发布缘由:
最近无意间看到有许多关于这题的博客,我看了题目和解法感觉完全可以用更清晰的思路解决,网上大部分解答均缺乏模块化的编程思想,我觉得这题用dfs枚举便可以解决由于只有三种符号加上n<10的条件复杂度也就在O(3^n)并不需要太多的优化,于是我翻出之前的代码,用c写了一遍(之前用的c++)供大家参考。
#include <stdio.h>
#include <math.h>
int n,num=0,sum=0;
int book[1000];#用于记录符号
int main(){
void dfs( int step);
scanf("%d",&n);
dfs(1);
printf("%d",num);
}#dfs全排列枚举book
void dfs( int step){
int tail,j,i;
if(step==n){
int k;
int a[1000]={0};
a[1]=1;
tail=2;
for(k=1;k<n;k++){
switch(book[k]){
case 1: a[tail++]=k+1;break;#加号
case 2: a[tail++]=-(k+1);break;#减号
case 3: a[tail-1]=(abs(a[tail-1])*10+k+1)*(a[tail-1]/abs(a[tail-1]));break;#空格情况
}
}
sum=0;
for(j=1;j<tail;j++){
sum+=a[j];
}
if(sum==0) num++;
return;
}
else{
for(i=1;i<=3;i++){
book[step]=i;
dfs(step+1);
}}
return;
}
大致分为两个模块
1.枚举book即计算方式。
2.当step到达临界值时进行判断计算。
复杂度虽高但在小数测试下该递归算法完全足矣