第3章第3节-火柴棍等式-枚举

/*NOIP2008提高组第二题改编
使用火柴棍拼出A+B=C的形式
注意:
1.加号和等号各自需要两根火柴棍
2.如果A!=B,则A+B=C与B+A=C视为不同的等式(A,B,C都大于0)
3.所有火柴棍必须全部使用
*/

/*
题目:小哼手上有m根(m<=24)火柴棍,那么小哼究竟可以拼出多少种不同形如A+B=C的形式呢?
规定时限是1秒。
思路:最简单的方法即为枚举法,A、B、C的枚举范围是0~1111。因为题目中最多只有24根火柴棍即m<=24。除去+和=占用的四根火柴还剩
20根火柴,而0~9这10个数字中,数字1使用的火柴棍最少,只需要两根火柴而10根火柴棍最多能组成10个1,故A、B、C三个数每个数都
不能超过1111。
*/

#include "stdio.h"
int fun(int x)
{
    int num = 0;//用来计数的变量,一定要记得初始化。一定要初始化 
    int f[10] = {6,2,5,5,4,5,6,3,7,6};//用一个数组来记录0~9每个数字所使用的火柴棍数量
    while(x / 10 != 0)//如果x / 10 的商不等于0的话,说明这个数至少有两位
    {
        num += f[x % 10];//获得x的末尾数字并将次数所用到的火柴棍数累加到num中
        x = x / 10;//去掉x的末尾数字,例如x的值为123则现在x的值为12
    }
    num += f[x];//最一定后加上此时x所需要用到的火柴棍根数(此时x是个一位数)
    return num;//返回需要火柴棍的总根数
}

int main()
{
    int a,b,c,m,sum = 0;//sum是用来计数的,因此一定要初始化为0
    scanf("%d",&m);//读入火柴棍的个数

    //开始枚举a和b,c可通过a+b算出,时间复杂度为O(N2)
    for(a = 0; a <= 1111; a++)
    {
        for(b = 0; b <= 1111; b++)
        {
            c = a + b;//计算出c
            //fun是我们自己写的子函数,用来计算一个数所需要用火柴棍的总数
            //当a使用的火柴棍根数 + b使用的火柴棍根数 + c使用的会拆棍根数之和 = m - 4 时即为一组解
            if(fun(a) + fun(b) + fun(c) == m - 4)
            {
                printf("%d+%d=%d\n",a,b,c);
                sum++;
            }
        }
    }
    printf("一共可以拼出%d个不同的等式",sum);
    getchar();getchar();
    return 0;
}
/*
样例输入:
18
样例输出:
0+4=4
0+11=11
1+10=11
2+2=4
2+7=9
4+0=4
7+2=9
10+1=11
11+0=11
*/

猜你喜欢

转载自blog.csdn.net/perfect_zdq/article/details/89285625
今日推荐