作者在 2014-07-07 19:08:41 发布以下内容
123456789在这些数之间可以差如+,-,最后等于某个值的组合数
方法一:递归法
void f2(int index,int opt,int sum,int value,int &count)
{
for(int i=index;i<=9;i++){
int t=0;
for(int m=index;m<=i;m++) t=10*t+m;
if(i==9){
sum=sum+opt*t;
if(value==sum) count++;
return ;
}
f2(i+1,1,sum+opt*t,value,count);
f2(i+1,-1,sum+opt*t,value,count);
}
}
方法二:循环
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<queue>
int main()
{
long long temp=1;
int count=0;
int op[8];
int input;
scanf("%d",&input);
long long data=(long long )input;
for(op[0]=-1;op[0]<2;op[0]++)
{
for(op[1]=-1;op[1]<2;op[1]++)
{
for(op[2]=-1;op[2]<2;op[2]++)
{
for(op[3]=-1;op[3]<2;op[3]++)
{
for(op[4]=-1;op[4]<2;op[4]++)
{
for(op[5]=-1;op[5]<2;op[5]++)
{
for(op[6]=-1;op[6]<2;op[6]++)
{
for(op[7]=-1;op[7]<2;op[7]++)
{
temp=1;
std::queue<long long> num_que;
std::queue<int> opt;
for(int i=0;i<8;i++)
{
if(op[i]){
num_que.push(temp);
temp=i+2;
opt.push(op[i]);
}
else
{
temp=temp*10+i+2;
}
}
num_que.push(temp);
temp=num_que.front();
num_que.pop();
while(!num_que.empty())
{
long long opt_t=(long long )opt .front();
temp=temp+num_que.front()*opt_t;
num_que.pop();
opt.pop();
}
if(temp==data) count++;
}
}
}
}
}
}
}
}
printf("%d\n",count);
}
方法三:三叉树路径