题解

166 条题解

  • 2
    @ 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;
    }
    
  • 2
    @ 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;
    }
    
  • 1
    @ 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;
    } 
    
  • 1
    @ 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;
    }
                        
    
  • 1
    @ 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
    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.

  • 1
    @ 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;
    }

  • 1
    @ 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;
    }  
    
  • 1
    @ 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;
    }

  • 1
    @ 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;
    }
    
  • 1
    @ 2009-07-23 14:59:58

    为什么是试到1000呢?

  • 1
    @ 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

    readln(n);

    writeln(a[n]);

    end.

  • 1
    @ 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

  • 0
    @ 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;
    }

  • 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;
    }
    
  • 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;
    }
    
    
  • 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;
    }

  • 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;
    }

  • 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;
    }

  • 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

  • 0
    @ 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
    readln(n);
    if (n>=1) and (n<=12) then writeln(0)
    else writeln(a[n]);
    readln;
    end.

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

      打表党死!!!

信息

ID
1496
难度
3
分类
搜索 点击显示
标签
递交数
6082
已通过
2977
通过率
49%
被复制
17
上传者