1200.火柴棒等式

题目描述

给你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根火柴棍必须全部用上
 

输入

输入共一行,只有一个整数n(n<=24)。

输出

输出共一行,表示能拼成的不同等式的数目。

输入样例复制

【输入输出样例1】
14

【输入输出样例2】
18

输出样例复制

【输入输出样例1】
2

【输入输出样例2】
9

说明

【输入输出样例1解释】
2个等式为0+1=1和1+0=1。

【输入输出样例2解释】
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

红色字是重点哦!

思路讲解

这道题目简单来讲还是很简单的,将可能出现的数字的所需数量得出

并进行遍历,即为正解!

代码解说

首先需要进行定义每一位各位数火柴棒所需的数量:

int number[]={6,2,5,5,4,5,6,3,7,6};

因为这个的循环次数不确定,所以最好给出一个确定的常量

const int N=200;

插入一个小知识点:宏定义

什么是宏定义?

就是用一个你想用的字符串来代替已知的字符串!

具体用法:

#define 你想要的字符串 你想要替换的字符串

例如:

#define _for(a,c,b) for(int a=c;a<=b;a++)

那么便将 _for(a,c,b) 转换为了 for(int a=c;a<=b;a++)

例如 _for(i,1,100) 那实际意义就是 for(int i=1;i<=100;i++)

另外:

宏定义纯粹是替换,例如 #define N 12+4

那么cout<<N*2;

得出的数是12+4*2而不是(12+4)*2

要想达到(12+4)*2

那么就可以将#define N 12+4更改为#define N (12+4)

好了我们回到正题

int ws_pd(int n,int k)//位数判定 

{

long long t,s;

t=pow(10,k);

s=n%t;

if(n==s)

return k;

else

ws_pd(n,k+1);

}

#define ws(a) ws_pd(a,1)

先写一个函数进行位数判定,其实是为截取每一位数做准备

截取每一位数

int jq(int n,int f)

{

  memset(a,0);y=z=0;

  int k=n,s=0;

  while(k!=0)

  {

   s++;

   k/=10;

  }

  y=s-1;

  for(int i=1;i<=s;i++)

  {

   z++;

   k=n;

   a[z]=k/pow(10,y);

 a[z]%=10;

   y--;

  }

  return a[f];

}


这个函数实际上是截取 n 的第 f位

主函数

{

        cin>>n;

     _for(i,0,N)

     {

_for(j,1,ws(i))

atake[dmax]+=number[jq(i,j)];//将每一位数截取出来并将对应的值赋值到atake中,例如12的火柴棒值在这里面就是2+5=7

dmax++;//下一个数

 }

 _for(i,0,N)_for(j,0,N)_for(p,0,N)

 {

 if(atake[i]+atake[j]+atake[p]+4==n&&i+j==p)

//atake[i]+atake[j]+atake[p]+4==n 这句话的意思是三个数加上运算符的火柴棒数量等于总量

//i+j==p这句话是前两个数的值相加等于第三个数

 emax++;//如果满足,满足的等式加一个

 }

 cout<<emax;//输出满足条件的等式

   return 0;

}

tips:这个答案只能获取部分分数!

#include<bits/stdc++.h>
using namespace std;
int num[11]={6,2,5,5,4,5,6,3,7,6};
int s(int x)
{
    if(x==0)
    return num[0];
    int ans=0;
    while(x!=0)
    {
        int t=x%10;
        ans+=num[t];
        x/=10;
    }
    return ans;
}

int main()
{
    int n,sum=0;
    cin>>n;
    for(int i=0;i<=1000;++i)
    {
        for(int j=0;j<=1000;++j)
        {
            if(s(i)+s(j)+s(i+j)+4==n)
               sum++;
        }
    }
    cout<<sum;
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值