A - 火柴棒等式

A - 火柴棒等式
给你 n 根火柴棍,你可以拼出多少个形如 "A+B=C" 的等式?等式中的 A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 0)。

用火柴棍拼数字 0-9,0−9 分别用的火柴棒数量为:6 2 5 5 4 5 6 3 7 6;
注意:

加号与等号各自需要两根火柴棍

如果 A !=B,则 A+B=C与 B+A=C 视为不同的等式(A、B、C ≥0)

n 根火柴棍必须全部用上

输入格式
输入一个整数 n(n≤24)。

输出格式
输出能拼成的不同等式的数目。

Sample Input
5
Sample Output
0


#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int a[10] = { 6,2,5,5,4,5,6,3,7,6 };//0~9需要的火柴棒数
    int sum = 0;
    int n;
    cin >> n;
    n -= 4;
    if (n < 9) {//最少的火柴棒组合是1+1=2,去掉运算符需要9根火柴
        cout << 0;
        return 0;
    }
    int ti, tj, tk, t;//分别记录数字i,j,他们的加和k大于10的部分,总计 的火柴棒数
    for (int i = 0;; i++) {
        for (int j = 0;; j++) {
            ti = tj = tk = t = 0;//归0
            int k = i + j;
            int lowi = i, lowj = j, lowk = k;//拷贝,方便下面计算
            while (lowi >= 10) {
                int u = lowi % 10;
                ti += a[u];
                lowi /= 10;
            }
            while (lowj >= 10) {
                int u = lowj % 10;
                tj += a[u];
                lowj /= 10;
            }
            while (lowk >= 10) {
                int u = lowk % 10;
                tk += a[u];
                lowk /= 10;
            }
            if (ti + a[lowi] >= 6 + n) {//当数字i需要的火柴棒数大于n时,结束程序
                cout << sum;            //之所以用2*n,是因为i大不代表用的火柴棒多,多1个足够(洛谷上足够,但vj上不够,   
                return 0;               //我试了试,时间超限的临界是n=30,再多就会超限,这就多加6了),j同理
            }
            if (tj + a[lowj] >= 6 + n) break;//当数字j需要的火柴棒数大于n时,进入下一个i,同时归0j
            t += ti + tj + tk;//不用ti,tj,tk代表数总共需要的火柴棒数是为了避免0的问题
            t += a[lowk] + a[lowi] + a[lowj];
            if (t == n) {
                sum++;//总火柴棒数等于n的时候,累和加一
            }
            else continue;//否则进入下一个j
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿白|

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值