火柴棍等式



超超终于向他的女神小美表白了。可是小美只喜欢聪明的程序员,当场给他出了道难题,题目如下:给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:

注意:
1. 加号与等号各自需要两根火柴棍
2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)
3. n根火柴棍必须全部用上
超超分分钟就解出来了。
亲爱的小伙伴们,你们是不是也可以分分钟搞定这道难题呢?

Input

一个整数N( N <= 24),表示N根火柴棍

Output

可以拼出形如“A+B=C”的等式的个数。如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)

Sample Input

18

Sample Output

9

Hint

9个等式为:

0+4=4

0+11=11

1+10=11

2+2=4

2+7=9

4+0=4

7+2=9

10+1=11

11+0=11

先把每个数对应的所需火柴棍的个数存到一个数组里,写一个自定义的函数将1从1999的数表示所需的火柴棍存到另一个数组里。利用遍历求出你输入的火柴棍数量所能组成的等式。注意当A与B不同时可代表两个等式。

AC代码:#include<cstdio> #include<iostream> #include<cstdlib> using namespace std; int need[] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6}; int M[2000]; int ans; int match(int cur) {         int ans = 0, ret;         if (cur == 0)         {                 return 6;         }         while (cur > 0)         {                 ret = cur % 10;                 ans += need[ret];                 cur /= 10;         }         return ans; } void GetMatch() {         for (int i = 0; i <= 1999; ++i)         {                 M[i] = match(i);

        } } int main() {         int n = 24;         scanf("%d", &n);         GetMatch();         for (int i = 0; i <= 1000; i++)                 for (int j = i; j <= 1000; j++)                 {                         int a = M[i];                         int b = M[j];                         if (a + b > n - 6)                         {                                 continue;                         }                         int d = M[i + j];                         if (a + b + d + 4 == n && i != j)                         {                                 ans += 2;                         }                         if (a + b + d + 4 == n && i == j)                         {                                 ans++;                         }                 }         printf("%d\n", ans);         return 0; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值