166 条题解
-
2yyyz108 LV 8 @ 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; }
-
22017-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; }
-
12021-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; }
-
12017-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; }
-
12017-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
readln(n);n:=n-4;
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. -
12017-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;
}
-
12017-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; }
-
12017-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;
} -
12017-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; }
-
12009-07-23 14:59:58@
为什么是试到1000呢?
-
12009-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
readln(n);
writeln(a[n]);
end. -
12009-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 -
02021-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;
} -
02019-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; }
-
02017-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; }
-
02017-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;
} -
02017-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;
} -
02017-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;
} -
02015-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 -
02013-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
readln(n);
if (n>=1) and (n<=12) then writeln(0)
else writeln(a[n]);
readln;
end.