找到关系方程就行了
a+b=c
X[a]+X[b]+X[c]=n
#include<bits/stdc++.h>
using namespace std;
int main(){
int SNum[10]={6,2,5,5,4,5,6,3,7,6},n,X[1000];
//对于题目要求的A+B=C,易知C最大为987,当然,C最小为2,
//每个数字对应的火柴
cin>>n;//输入火柴数目
n-=4;//加号和等号分别两个火柴
int i,j,k,l,cnt=0;
for(i=0;i<=9;i++){//C为一位数
X[i]=SNum[i];
}
l=10;
for(i=1;i<=9;i++){
for(j=0;j<=9;j++){
X[l]=SNum[i]+SNum[j];
l++;
}
}
for(i=1;i<=9;i++){
for(j=0;j<=9;j++){
for(k=0;k<=9;k++){
X[l]=SNum[i]+SNum[j]+SNum[k];
l++;
}
}
} //X[i]存有数字0-987所需的火柴数
//此题需要满足的条件是
//a+b=c
//X[a]+X[b]+X[c]=n
for(i=0;i<987;i++){
for(j=0;j<987;j++){
for(k=0;k<987;k++){
if(i+j==k&&X[i]+X[j]+X[k]==n){
cnt++;
//cout<<"i="<<i<<"j="<<j<<"k="<<k<<endl;
//cout<<"X[i]="<<X[i]<<"X[j]="<<X[j]<<"X[k]="<<X[k]<<endl;
//cout<<cnt<<endl<<endl;
};
}
}
}
cout<<cnt;
}
但是超时了!!
编译运行后得知边界值是711,所以最后的查找循环改为
for(i=0;i<=711;i++){
for(j=0;j<=711;j++){
for(k=0;k<=711;k++){
if(i+j==k&&X[i]+X[j]+X[k]==n){
cnt++;
//cout<<"i="<<i<<"j="<<j<<"k="<<k<<endl;
//cout<<"X[i]="<<X[i]<<"X[j]="<<X[j]<<"X[k]="<<X[k]<<endl;
//cout<<cnt<<endl<<endl;
};
}
}
}
AC