166 条题解

• @ 2017-11-09 11:58:26

打表就行，但注意数组大小

``````#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,ans;
int d[2500]={6,2,5,5,4,5,6,3,7,6};
int main()
{
cin>>n;
for(int i=10;i<=2000;i++)
d[i]=d[i/10]+d[i%10];
for(int i=0;i<=1000;i++)
for(int j=0;j<=1000;j++)
if(d[i]+d[j]+d[i+j]+4==n)
ans++;
cout<<ans;
return 0;
}
``````
• @ 2017-10-28 08:11:10

无脑暴力即可

``````#include <queue>
#include <cmath>
#include <cctype>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;
int a[1001];
int main()
{
int n,s=0;
scanf("%d",&n);
a[0]=6;
a[1]=2;
a[2]=5;
a[3]=5;
a[4]=4;
a[5]=5;
a[6]=6;
a[7]=3;
a[8]=7;
a[9]=6;
for(int i=10;i<=2000;i++)
{
a[i]=a[i/10]+a[i%10];
}
for(int i=0;i<=1000;i++)
{
for(int j=0;j<=1000;j++)
{
if(a[i]+a[j]+a[i+j]+4==n)
{
s++;
}
}
}
printf("%d",s);
return 0;
}
``````
• @ 2021-05-20 20:25:19
``````#include<iostream>
using namespace std;
int n,a[20]={6,2,5,5,4,5,6,3,7,6},num[3000],ans,k,tmp;
int main(){
cin>>n;
num[0]=6;
for(int i=1;i<=2000;i++){
k=i;
while(k){
tmp+=a[k%10];
k/=10;
}
num[i]=tmp;
tmp=0;
}
for(int i=0;i<=999;i++){
for(int j=0;j<=999;j++){
if(num[i]+num[j]>=n) continue;
else{
if(num[i+j]+num[i]+num[j]+4==n) ans++;
}
}
}
cout<<ans;

return 0;
}
``````
• @ 2021-05-20 20:26:12

太棒了

• @ 2017-11-28 18:01:06
``````#include<stdio.h>
int num[11]={6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
int count(int a);
int main(){
int n, ans=0;
scanf("%d", &n);
for(int i=0; i<=1000;i++)
for(int j=0; j<=1000; j++)
if(count(i)+count(j)+count(i+j)+4==n) ans++;
printf("%d", ans);
return 0;
}
int count(int a){
int all=0;
for(int i=a; i!=0; i/=10) all+=num[i%10];
if(a==0) all+=num[0];
return all;
}

``````
• @ 2017-10-20 22:52:08

var
a:array[0..9] of longint;
b:array[0..10000] of longint;
i,j,k,n,m,ans,ans1:longint;
function change(x:longint):longint;
var i,j,k:longint;
begin
k:=x; change:=0;
while k>0 do
begin
j:=k mod 10;
k:=k div 10;
change:=change+a[j];
end;
if x=0 then change:=6;
end;
begin
a[0]:=6;a[1]:=2;a[2]:=5;a[3]:=5;a[4]:=4;
a[5]:=5;a[6]:=6;a[7]:=3;a[8]:=7;a[9]:=6;
for i:=0 to 10000 do
b[i]:=change(i);
b[0]:=6;
for i:=0 to 10000 do
if b[i]<n then
for j:=0 to 10000 do
if b[i]+b[j]<n then
begin
k:=n-b[i]-b[j];
if change(i+j)=k then inc(ans);
end;
writeln(ans);
end.

• @ 2017-10-16 22:47:00

首先打表每个数字需要的火柴数
然后就可以枚举两个数以及和，拆分每一位求火柴数和，需要注意的是数的位数最多可到三位数
储存一下或者打表会快一点，但就此题数据没有必要
当然在考场上还是要打表输出啦
```cpp #include<iostream> using namespace std; int num[11]={6,2,5,5,4,5,6,3,7,6,0}; int main() { int n,sum=0,i,k,a,b,c,d,e,f,temp,sumi,sumk,sumik; cin>>n; n-=4; for(i=0;i<=1000;i++) { temp=i,sumi=0; do { sumi+=num[temp%10]; temp/=10; }while(temp!=0); for(k=0;k<=1000;k++) { temp=k,sumk=0; do { sumk+=num[temp%10]; temp/=10; }while(temp!=0); temp=i+k,sumik=0; do { sumik+=num[temp%10]; temp/=10; }while(temp!=0); if(sumi+sumk+sumik==n) sum++; } } cout<<sum; return 0; } ```

• @ 2017-10-05 03:11:59

so water

``````#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <set>
using namespace std;
int main()
{
int a[10]={6,2,5,5,4,5,6,3,7,6};
int ku[50]={0};
int i,j;
for(i=0;i<=1000;i++)
{
for(j=0;j<=1000;j++)
{
int q1=i,q2=j,q3=i+j,c1=0,c2=0,c3=0;
{
while(q1>=1)
{
c1+=a[q1%10];
q1/=10;
}
while(q2>=1)
{
c2+=a[q2%10];
q2/=10;
}
while(q3>=1)
{
c3+=a[q3%10];
q3/=10;
}
if(i==0)
c1=a[i];
if(j==0)
c2=a[j];
if(i==0&&j==0)
c3=a[i+j];
if(c1+c2+c3<=20)
ku[c1+c2+c3+4]++;
}
}
}
int n;
scanf("%d",&n);
printf("%d",ku[n]);
return 0;
}
``````
• @ 2017-06-03 01:11:21

#include<iostream>
using namespace std;
int fun(int n)
{
int num=0;
int f[10]={6,2,5,5,4,5,6,3,7,6};
while(n/10!=0)
{
num+=f[n%10];
n=n/10;
}
num+=f[n];
return num;
}
int main()
{
int a,b,c,m,sum=0;
cin>>m;
for(a=0;a<=1111;a++)
{
for(b=0;b<=1111;b++)
{
c=a+b;
if(fun(a)+fun(b)+fun(c)==m-4)
{
sum++;
}
}
}
cout<<sum<<endl;
return 0;
}

• @ 2017-04-24 13:00:00

暴力枚举就可以过，注意数据中最多可以构造到**三位数**。

``````#include <iostream>
#include <sstream>
using namespace std;

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

int f(int n) {
int result = 0;
do {
result += matches[n % 10];
n /= 10;
} while (n > 0);
return result;
}

int main() {
int n;
cin >> n;
n -= 4;
int result = 0;
for (int i = 0; i <= 1000; i++)
for (int j = 0; j <= 1000; j++) {
int stick = f(i) + f(j) + f(i + j);
if (stick == n)
result++;
}
cout << result << endl;
return 0;
}
``````
• @ 2009-07-23 14:59:58

为什么是试到1000呢？

• @ 2009-07-20 10:19:24

const

a:array[1..26] of integer=(0,0,0,0,0,0,0,0,0,0,0,0,1,2,8,9,6,9,29,39,38,65,88,128,192,319);

var

n:longint;

begin

writeln(a[n]);

end.

• @ 2009-07-19 15:35:22

#include

using namespace std;

int n,d[10];

void init()

{

cin>>n;

d[0]=6;d[1]=2;d[2]=5;d[3]=5;d[4]=4;

d[5]=5;d[6]=6;d[7]=3;d[8]=7;d[9]=6;

}

int suan(int x)

{

int sum=0;

if(x==0)return (d[x]);

else

{

while(x>0)

{

sum+=d[x%10];

x=x/10;

}

return (sum);

}

}

void search()

{

int a,b,c,sum=0;

for(c=0;c

• @ 2021-10-22 20:22:48

暴力枚举。
在正式比赛时要加freopen，在vijos提交时不要。
```cpp
#include<stdio.h>
#include<stdlib.h>

int n; //有几根火柴棒。
int sticks[10]={6, 2, 5, 5, 4, 5, 6, 3, 7, 6};

int dp[2010]; //每个数要多少火柴棒。

int main(){
freopen("sticks.in", "r", stdin);
freopen("sticks.out", "w", stdout);

scanf("%d", &n); //读入火柴棒数量。
dp[0]=6;

/*
为什么doing要等于1呢？很简单，因为如果doing=0，那么d=0，那么根本进入不了while循环，那么did=0，于是dp[doing]=0，于是dp[0]=0，但是dp[0]应该等于6，所以会错。
*/
for(int doing=1;doing<2000;doing++){ //计算每个数（包括两位数和三位数以及四位数）要几根火柴棒。
int did=0;
int d=doing;
while(d>=1){ //不断加上每一位的火柴数。
did+=sticks[d%10];
d/=10;
}
dp[doing]=did;
}

int found=0;
for(int doing=0;doing<=1000;doing++){
for(int did=0;did<=1000;did++){
if(dp[doing]+dp[did]+dp[doing+did]+2+2==n){
/*
为什么要+2+2呢？
这道题毕竟时提高组的，出题人超级坑，还有符号要加上去。
N+M=?，加号和等号也要火柴棒。
*/
found++;
}
}
}
printf("%d", found);
return 0;
}

• @ 2019-08-07 19:40:58
``````#include <bits/stdc++.h>
using namespace std;/*
int a[10]={6,2,5,5,4,5,6,3,7,6};
int count(int x)
{
int sum=0;
while(1)
{
sum+=a[x%10];
x/=10;
if(x==0)
return sum;
}
}
int main ()
{
int ans[25]={0};
for(int i=0;i<2000;i++)
for(int j=0;j<2000;j++)
{
int a=count(i),b=count(j),c=count(i+j);
if(a+b+c+4<=24)
{
ans[a+b+c+4]++;
}
}
for(int i=0;i<25;i++)
{
//  cout<<i<<":"<<ans[i]<<endl;
cout<<ans[i]<<",";
}
return 0;
}
*/
int ans[25]={0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,8,9,6,9,29,39,38,65,88,128};
int main ()
{
int x;
cin>>x;
cout<<ans[x]<<endl;
return 0;
}
``````
• @ 2017-11-05 09:56:28

整体的思路就是把它0-9的火柴棒对应数目先人为确定
然后题目给的数据最多也就是24跟火柴棒 除去4根表示加号等号
我们可以很快确定循环的边界条件1111
然后 就是要利用一个分离位数的函数来算多位数的火柴棒
代码如下：

``````#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cstring>
using namespace std;
int num[10]={6,2,5,5,4,5,6,3,7,6},n,ans=0;
int s(int a)
{
int ans_=0;
if(a==0&&ans_==0) return num[a];
while(a>=1)
{
ans_+=num[a%10];
a-=a%10;
a/=10;
}
return ans_;
}
int main()
{
cin>>n;
for(int i=0;i<=1111;i++)
{
for(int j=0;j<=1111;j++)
{
int k=i+j;
if(s(i)+s(j)+s(k)+4==n) ans++;
}
}
cout<<ans<<endl;
return 0;
}

``````
• @ 2017-10-12 20:12:53

因为24根火柴拼等式要用掉4根来拼“+”和“=”，所以一开始读入进来后n就可以减掉4。
因为0~9中拼1用的火柴数最小，所以考虑最大情况即为 1111+1=1112，并且火柴棍数超出了24，
所以拼的数字最大为1111，然后循环初始化，双重枚举找到满足条件后ans++,输出ans即可。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;

int n,ans=0;
int a[10]={6,2,5,5,4,5,6,3,7,6},num[1201];

void fun()
{
for(int i=0;i<=9;i++)
num[i]=a[i];
int t;
for(int i=10;i<=1200;i++)
{
t=i;
while(t)
{
num[i]+=a[t%10];
t/=10;
}
}
}

main()
{
memset(num,0,sizeof(num));
cin>>n;
n-=4;
fun();
int k;
for(int i=0;i<=1200;i++)
for(int j=0;j<=1200;j++)
{
k=i+j;
if(k<=1200&&num[i]+num[j]+num[k]==n)
ans++;
}
cout<<ans<<endl;
return 0;
}

• @ 2017-09-09 19:38:42

#include<iostream>
using namespace std;
int i,j,ans=0,n,a[2223],f[10]={6,2,5,5,4,5,6,3,7,6};
int main()
{

cin>>n;
n=n-4; //将运算符要的火柴棒减掉
for(i=0;i<10;i++) a[i]=f[i];
for(i=10;i<=2222;i++) a[i]=a[i/10]+f[i%10];
for(i=0;i<=1111;i++)//枚举A
for(j=i;j<=1111;j++)//枚举B,不妨让B<=A
if(a[i]+a[j]+a[i+j]==n)
{
if(i==j) ans++;
else ans=ans+2;
}

cout<<ans<<endl;
return 0;
}

• @ 2017-05-14 15:09:09

Ac50道纪念
#include<bits/stdc++.h>
using namespace std;
int a[10]={6,2,5,5,4,5,6,3,7,6};
int get(int t)
{
int ans=0;
do
{
ans+=a[t%10];
t/=10;
}while(t>0);
return ans;
}
int main()
{
int n;
cin>>n;
n-=4;
int sum=0;
for(int i=0;i<=999;i++)
{
for(int j=0;j<=999;j++)
{
for(int k=i+j;k<=999;k++)
{
//if(i!=j)
{
if(i+j==k)
{
if(get(i)+get(j)+get(k)==n)
{
sum++;
//cout<<i<<"+"<<j<<"="<<k<<endl;
}
}
}
}
}
}
cout<<sum<<endl;
return 0;
}

• @ 2015-08-25 09:28:46

#include <iostream>
#include <stdio.h>

using namespace std;

int a[] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 36 , 37 , 39 , 40 , 41 , 42 , 43 , 44 , 45 , 46 , 47 , 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 59 , 61 , 62 , 63 , 64 , 65 , 67 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 81 , 84 , 87 , 91 , 92 , 93 , 94 , 95 , 97 , 101 , 107 , 110 , 111 , 112 , 113 , 114 , 115 , 116 , 117 , 118 , 119 , 121 , 124 , 127 , 131 , 134 , 137 , 141 , 142 , 143 , 144 , 145 , 147 , 151 , 154 , 157 , 161 , 167 , 170 , 171 , 172 , 173 , 174 , 175 , 176 , 177 , 179 , 181 , 191 , 197 , 211 , 214 , 217 , 241 , 271 , 277 , 311 , 314 , 317 , 341 , 371 , 377 , 411 , 412 , 413 , 414 , 415 , 417 , 421 , 431 , 441 , 447 , 451 , 471 , 474 , 477 , 511 , 514 , 517 , 541 , 571 , 577 , 611 , 617 , 671 , 701 , 710 , 711 , 712 , 713 , 714 , 715 , 716 , 717 , 719 , 721 , 727 , 731 , 737 , 741 , 744 , 747 , 751 , 757 , 761 , 771 , 772 , 773 , 774 , 775 , 777 , 791 , 811 , 911 , 917 , 971 , 1111 , 1112 , 1113 , 1114 , 1115 , 1117 , 1121 , 1131 , 1141 , 1147 , 1151 , 1171 , 1174 , 1177 , 1211 , 1311 , 1411 , 1417 , 1471 , 1511 , 1711 , 1714 , 1717 , 1741 , 1771 , 1777 , 2111 , 3111 , 4111 , 4117 , 4171 , 4711 , 5111 , 7111 , 7114 , 7117 , 7141 , 7171 , 7177 , 7411 , 7711 , 7717 , 7771 , 11111 , 11117 , 11171 , 11711 , 17111 , 71111 };
int b[] = { 6 , 2 , 5 , 5 , 4 , 5 , 6 , 3 , 7 , 6 , 8 , 4 , 7 , 7 , 6 , 7 , 8 , 5 , 9 , 8 , 11 , 7 , 10 , 10 , 9 , 10 , 11 , 8 , 11 , 11 , 7 , 10 , 10 , 9 , 10 , 11 , 8 , 11 , 10 , 6 , 9 , 9 , 8 , 9 , 10 , 7 , 11 , 10 , 11 , 7 , 10 , 10 , 9 , 10 , 11 , 8 , 11 , 8 , 11 , 11 , 10 , 11 , 9 , 9 , 5 , 8 , 8 , 7 , 8 , 9 , 6 , 10 , 9 , 9 , 11 , 10 , 8 , 11 , 11 , 10 , 11 , 9 , 10 , 11 , 10 , 6 , 9 , 9 , 8 , 9 , 10 , 7 , 11 , 10 , 9 , 11 , 10 , 9 , 11 , 10 , 8 , 11 , 11 , 10 , 11 , 9 , 9 , 11 , 10 , 10 , 11 , 11 , 7 , 10 , 10 , 9 , 10 , 11 , 8 , 11 , 11 , 10 , 11 , 9 , 11 , 10 , 11 , 10 , 11 , 9 , 11 , 10 , 11 , 10 , 11 , 8 , 11 , 11 , 10 , 11 , 9 , 11 , 11 , 10 , 11 , 11 , 9 , 11 , 10 , 9 , 11 , 10 , 11 , 10 , 11 , 10 , 11 , 11 , 11 , 11 , 7 , 10 , 10 , 9 , 10 , 11 , 8 , 11 , 10 , 11 , 10 , 11 , 9 , 11 , 10 , 10 , 11 , 11 , 8 , 11 , 11 , 10 , 11 , 9 , 11 , 11 , 10 , 11 , 11 , 8 , 11 , 11 , 10 , 11 , 9 , 11 , 11 , 10 , 11 , 11 , 9 , 11 , 10 , 11 , 11 , 10 , 11 , 11 , 11 , 9 , 11 , 10 , 11 , 10 , 11 , 11 , 11 , 10 , 11 , 11 , 11 , 11 , 9 , 11 , 10 , 11 , 10 , 11 , 11 , 10 , 11 , 11 , 10 , 11 , 11 , 11 , 11 , 11 };
int n;

int i , j , k;
int ans;

int main()
{
scanf( "%d" , &n );
n -= 4;
for( i = 0 ; i < 238 ; i++ )
for( j = i ; j < 238 ; j++ )
for( k = 0 ; k < 238 ; k++ )
if( a[i] + a[j] == a[k] && b[i] + b[j] + b[k] == n )
ans += ( 1 + ( i != j ) );
cout << ans << endl;
return 0;
}
666

• @ 2017-09-10 16:24:44

有毒

• @ 2013-10-20 09:25:57

const
a:array[13..24] of longint=(1,2,8,9,6,9,29,39,38,65,88,128);
var
i,j,n,m:longint;
begin
if (n>=1) and (n<=12) then writeln(0)
else writeln(a[n]);
end.

• @ 2013-11-07 08:34:06

打表党死！！！

ID
1496

3

6075

2973

49%

17