这道题就是一个经典的暴力枚举
题意是输出一共有的火柴根数,输出这些火柴棒用完可以有多少拼法
下面,我们来数一数拼成十个数和两个符号(’+‘ && ’=‘)各用几根火柴棒
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~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
标签:10,洛谷,int,要用,ans,NOIP2008,while,火柴,P1149 From: https://www.cnblogs.com/zsy-2010/p/17177315.html