zoukankan      html  css  js  c++  java
  • 换一个角度看问题:火柴棒等式

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

  • 相关阅读:
    2. Redis哨兵、复制、集群的设计原理与区别
    1. 详解Redis的存储类型、集群架构、以及应用场景
    博客园主题优化
    【Java基础】Java面试题精选
    【Java集合】——集合类分析总结
    新零售供应链的三大闭环
    Comparable和Comparator比较实现排序 场景分析
    Java基础-枚举类
    Java基础-泛型
    微服务架构~BFF和网关
  • 原文地址:https://www.cnblogs.com/zcsor/p/6357607.html
Copyright © 2011-2022 走看看