| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5094 人关注过本帖
标题:C语言火柴编程题
只看楼主 加入收藏
liyue6822532
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2016-2-28
结帖率:57.14%
收藏
已结贴  问题点数:20 回复次数:9 
C语言火柴编程题


用n根火柴,拼成一个a+b=c的等式,’+’和’=’各占两根火柴,每个数字占固定的火柴,各数字占用火柴棒数如下:
0  1  2  3  4  5  6  7  8  9所用的火柴跟数如下:
6, 2, 5, 5, 4, 5, 6, 3, 7, 6
注意
1、    没有前置0,除非本身为0,a,b,c>=0.
2、    a+b=c和b+a=c记为不同的等式,除非a=b.
恰好把n根火柴用完,问一共可以凑多少种等式。
输入

多组测试样例,每组测试样例一个整数n,表示火柴棒总数。(n<=24).
输出

每组测试样例输出一个整数,表示能够凑成的等式的总个数。
样例输入

14
18

样例输出

2
9

提示

样例1:0+1=1 1+0=1 两种。
搜索更多相关主题的帖子: C语言 
2016-03-01 19:11
liyue6822532
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2016-2-28
收藏
得分:0 
我的想法是用循环找到俩个数字  然后判断这俩个数字加起来所用的火柴跟数是否小于n-4(就是减去加号和等号的跟数) 如果满足  就判断这俩数字加起来等于的数是否满足剩下的火柴跟数,然后代码写成了下面。。。
#include<stdio.h>
int main()
{
    int x[10] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
    int m, n, a, b, c, d=0,i,j;
    int k = 0, s = 0, sum = 0,sum1=0;
    while (scanf("%d", &m) != EOF)
    {
        for (i = 0; i < 1000; i++)
        {
            for (j = 0; j < 1000; j++)
            {
                b = i;
                a = j;
                while (d >= 0)
                {
                    d = b % 10;
                    b = b / 10;
                    n = d;
                    for (c = 0; c < 10; c++)
                    {
                        if (x[c] == n)
                        {
                            sum += x[c];
                        }
                    }
                }
                while (d >= 0)
                {
                    d = a % 10;
                    a = a / 10;
                    n = a;
                    for (c = 0; c < 10; c++)
                    {
                        if (x[c] == n)
                        {
                            sum += x[c];
                        }
                    }
                }
                if (sum < m - 4)
                {
                    s = i + j;
                    b = s;
                    while (d >= 0)
                    {
                        d = b % 10;
                        b = b / 10;
                        n = d;
                        for (c = 0; c < 10; c++)
                        {
                            if (x[c] == n)
                            {
                                sum1 += x[c];
                            }
                        }
                    }
                    if (sum1 == n - 4 - sum)
                    {
                        k++;
                        sum = 0; sum1 = 0;
                    }
                }
            }
        }
        printf("%d\n", k);
        k = 0;
    }
}
。。。。。。然后并不能跑起来。。。白小C求大神指点。
2016-03-01 19:14
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
1111+1=1112 这个等式需要25根火柴,而题目限制是25根
因此abc这三个数最多只有三位
2016-03-01 19:40
liyue6822532
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2016-2-28
收藏
得分:0 
回复 3楼 rjsp
题目限制是24根
2016-03-01 22:41
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:5 
回复 4楼 liyue6822532
是的,不小心把24写成了25(昨天是用手机回复的)

火柴一种才25种可能,直接给出答案行不行?
程序代码:
#include <stdio.h>

int main( void )
{
    const unsigned results[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 };
    for( unsigned n; scanf("%u",&n)==1 && n<=24; )
        printf( "%u\n", results[n] );

    return 0;
}

如果不行的话,把计算过程也贴出来
程序代码:
#include <stdio.h>

int main( void )
{
    // 算出1000以内的每个数需要的火柴数
    unsigned sticks[1000] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
    for( unsigned i=10; i!=1000; ++i )
        sticks[i] = sticks[i/10] + sticks[i%10];
    // 算出火柴数小于等于24的所有等式数目
    unsigned results[25] = { 0 };
    for( unsigned a=0; a!=1000; ++a )
        for( unsigned b=0; a+b!=1000; ++b )
        {
            unsigned sum = getsticks(a)+getsticks(b)+getsticks(a+b)+4;
            if( sum <= 24 )
                ++results[sum];
        }

    // 和第一段代码相同
    for( unsigned n; scanf("%u",&n)==1 && n<=24; )
        printf( "%u\n", results[n] );

    return 0;
}

2016-03-02 09:32
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:15 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX 999

//获取一个数a需要的火柴数
int getGen(int a)
{
    int gen,i,j,k;

    if(a<=9)
    {
       switch(a)
       {
           case 0: gen=6; break;
           case 1: gen=2; break;
           case 2: gen=5; break;
           case 3: gen=5; break;
           case 4: gen=4; break;
           case 5: gen=5; break;
           case 6: gen=6; break;
           case 7: gen=3; break;
           case 8: gen=7; break;
           case 9: gen=6; break;
       }

       return gen;
    }
    else if(a<=99)
    {
        i=a/10;
        j=a%10;

        gen=getGen(i)+getGen(j);

        return gen;
    }
    else
    {
        i=a/100;
        j=(a/10)%10;
        k=a%10;

        gen=getGen(i)+getGen(j)+getGen(k);

        return gen;
    }
}

void getKinds(int a,int kind[])
{
    int i,j,count;

    //i+j=a,那么i,j必有一个>=a/2,一个<=a/2
    for(i=0;i<=a/2;i++)
    {
        j=a-i;
        count=getGen(i)+getGen(j)+getGen(a);
        if(count<=20)
        {
            kind[count+4]+=2;  //a+b=c和b+a=c记为不同的等式,所以加2
            if(i==j) kind[count+4]-=1;  //若a,b相同则上面多加了一个
        }
    }
}

int main()
{
    //knds[i]表示i根火柴能够凑成的等式的总个数
    int c,knds[25]={0};

    //枚举所有的c值,a+b=c,计算所有a,b的火柴数并记入knds
    for(c=0;c<=MAX;c++)
    {
        getKinds(c,knds);
    }

    int n;
    scanf("%d",&n);
    printf("%d\n",knds[n]);

    return 0;
}


[此贴子已经被作者于2016-3-2 10:14编辑过]


   唯实惟新 至诚致志
2016-03-02 10:09
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
对于一位数好计算,当数位增多时不好处理

一片落叶掉进了回忆的流年。
2016-03-02 15:47
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
对于一位数好计算,当数位增多时不好处理

一片落叶掉进了回忆的流年。
2016-03-02 15:48
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
对于一位数好计算,当数位增多时不好处理

一片落叶掉进了回忆的流年。
2016-03-02 15:48
liyue6822532
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2016-2-28
收藏
得分:0 
谢谢各位大神的简答
2016-03-02 18:34
快速回复:C语言火柴编程题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043882 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved