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


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

  • 相关阅读:
    服务器监控
    hadoop
    tomcat7 配置
    tomcat
    列表加载
    自适应网页设计(Responsive Web Design)
    Android Native 代码NDK开发学习笔记
    NDK开发历程(一):android native code的调试方法
    Android原生(Native)C开发之一:环境搭建篇
    ajaxfileupload 传参数
  • 原文地址:https://www.cnblogs.com/zcsor/p/6357607.html
Copyright © 2020-2023  润新知