换一个角度看问题:火柴棒等式
这个问题是说给定一定数量(最多24根)的火柴棒,用全部这些火柴棒组成一个A+B=C的算式,其中每个数字拼法如下:
而加号和等号均为2根火柴。
这个问题题意没有明确说明负号问题,但从出题者传递的“意境”来看,其中A,B,C均大于等于0。
第一眼看到这个问题的时候就在想,是不是要把火柴棍数目-4然后看能分成几个数字,再把这些数字摆放成3个数字,再检测是否相等。这样做涉及的问题太多了,例如235都是5根,069都是6根……最高位不能为0……好烦的代码。换个角度思考一下,我们先有算式,然后计算火柴棍个数,这就简单多了:
#include<iostream> #include<cstring> using namespace std; const int maxnum=777; const int nbn[10]={6,2,5,5,4,5,6,3,7,6}; //0-9 int n2n(int n){ if(n==0){ return nbn[0]; }else{ int cnt=0; while(n!=0){ cnt+=nbn[n%10]; n/=10; } return cnt; } } int search(int n){ int i,j,cnt=0; for(i=0;i<maxnum;i++){ //7777+0=7777 for(j=0;j<maxnum;j++){ if(n2n(i)+n2n(j)+n2n(i+j)==n){ cnt++; } } } return cnt; } int main(){ int k; cin>>k; if(k<13){ //1+1=2 cout<<0<<endl; }else{ cout<<search(k-4)<<endl; //+= } }
代码中做了一点小优化。对于i,j上限的得出就是贪心的想法,7的性价比最高,假定为777+0=777(除+=正好24),类似可证77不够大,所以最大值可以用777(打印一下i、j就可以知道实际上最大用到711)。