换一个角度看问题:火柴棒等式

  这个问题是说给定一定数量(最多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)。

posted @ 2017-01-29 18:46  zcsor~流浪dè风  Views(382)  Comments(0Edit  收藏  举报