洛谷P1149 [NOIP2008 提高组] 火柴棒等式

这道题就是一个经典的暴力枚举

题意是输出一共有的火柴根数,输出这些火柴棒用完可以有多少拼法

下面,我们来数一数拼成十个数和两个符号(’+‘ && ’=‘)各用几根火柴棒

0要用6根火柴 1要用2根火柴

2要用5根火柴 3要用5根火柴

4要用4根火柴 5要用5根火柴

6要用6根火柴 7要用3根火柴

8要用7根火柴 9要用6根火柴

而’+‘ 和’=’各需要2根火柴棒

先来看其中一段代码

int a[3000]={6,2,5,5,4,5,6,3,7,6};
int main(){
int n,ans=0,k=0,y=0;
cin>>n;
n-=4;

输入一个数,n,ans是记录有几次火柴棒可以全部拼完,k是来协助判断火柴棒是否用完,y是用来判断数的。

n-=4是先减去'+'和‘=’的火柴棒的个数的,剩下的就是数字用的火柴棒数

解决这些问题后,下面的代码就很重要了

for(int i=10;i<=3000;i++){
y=i;
while(y){
a[i]+=a[y%10];
y/=10;
}
}
for(int i=0;i<=1111;i++){
for(int j=0;j<=1111;j++){
k=i+j;
if(a[i]+a[j]+a[k]==n)
ans++;
}
}
cout<<ans;

第一个while是来记录数字的,第二个for是来判断是否满足条件的,满足条件就加一

 

 i和j<=1111是因为1111是他的最大限度

以上是代码最难的一部分,下面是全部代码

#include <bits/stdc++.h>
using namespace std;
int a[3000]={6,2,5,5,4,5,6,3,7,6};
int main(){
int n,ans=0,k=0,y=0;
cin>>n;
n-=4;
for(int i=10;i<=3000;i++){
y=i;
while(y){
a[i]+=a[y%10];
y/=10;
}
}
for(int i=0;i<=1111;i++){
for(int j=0;j<=1111;j++){
k=i+j;
if(a[i]+a[j]+a[k]==n)
ans++;
}
}
cout<<ans;
return 0;
}

//so easy

再会

886~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

posted @ 2023-03-03 23:00  intelzsy  阅读(89)  评论(3)    收藏  举报