火柴棍等式(暴力枚举)

目录

题目

题目分析

解法

运行结果


题目

【题目描述】

给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。

注意

(1)加号与等号各自需要两根火柴棍;

(2)如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C≥0);

(3)n根火柴棍必须全部用上。

输入: 输入共一行,有一个整数n(n≤24)。

输出: 输出共一行,表示能拼成的不同等式的数目。

【输入样例1】

14

【输入样例1】

2

【输入样例2】

18

【输出样例2】

 9


题目分析

(1)加号与等号各自需要两根火柴棍,火柴棍数量可以先在开始的时候减4,也可以在最后加4

(2)火柴棍的数量和数字之间的联系,抽象成数组下标和数组元素

(3)注意两位数运算

【参考代码】未通过100%测试点

#include <iostream>
using namespace std;
//火柴棍等式 暴力算法
int main()
{
	int n;
	int arr[11] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
	cin >> n;
	n = n - 4;  //减去+=号所需的火柴棍
	int count = 0;
	int i, j, k, a, b;
	for( i=0; i < n; i++ )
		for (j = 0; j < n; j++)
			for (k = 0; k < n; k++) //k可以i+j
			{
				if (i + j == k  && arr[i] + arr[j] + arr[k] == n)
				{
					cout << i << "+" << j << "=" << k << endl;
					count++;
				}

				if (i + j > 10)  //两位数的判断
				{
					int sum = i + j;				
					b = sum % 10;
					sum /= 10;
					a = sum % 10;
					if (arr[i] + arr[j] + arr[a] + arr[b] == n)
					{
						cout << i << "+" << j << "=" << (10 * a + b) << endl;
						count++;
						break;  //避免多个重复解
					}
				}
			}
	cout << count;
}

最后一个for循环可以不要,换成i+j

【运行结果】

上面这个代码只能出两位数的结果,题目上的A+B=C可以是1111+1=1112,刚好用完24根火柴。

代码参考自:信息学奥赛一本通 1852:【08NOIP提高组】火柴棒等式 | OpenJudge NOI 4.7 8466:火柴棒等式 | 洛谷 P1149 [NOIP2008 提高组] 火柴棒等式_1852:【08noip提高组】火柴棒等式-CSDN博客文章浏览阅读820次,点赞2次,收藏3次。枚举两个可能的加数,枚举范围为0~1111,对于每次枚举出的两个加数,求出这两个数字相加的等式所用的火柴棍数量是否等于n,如果是,则计数。设函数matchCt,matchCt(n)求数字n由多少火柴棍组成,用数字拆分的方法得到n的每位数字,将组成每位数字的火柴棍数量加和返回。打表程序:枚举两个加数为0~1111的每种情况,只要加和火柴数加和小于等于24,则做计数,将所有的计数带逗号输出。而后枚举每对可以相加的数字组成等式,直接在st数组中取值来获取数字使用火柴棍的数量,复杂度会比解法1降低一些。......_1852:【08noip提高组】火柴棒等式https://blog.csdn.net/lq1990717/article/details/126267970思路可以去看看

#include <iostream>
using namespace std;
//火柴棍等式 暴力算法
int arr[11] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 };

int f(int num)
{
    int sum = 0;
    do
    {
        sum += arr[num % 10];
        num /= 10;
    }while(num);
    return sum;
}

int main()
{
	int n;
	cin >> n;
	n = n - 4;  //减去+=号所需的火柴棍
	int count = 0;
	int i, j;
    for( i=0; i <= 1111; i++ )
		for (j = 0; j <= 1111; j++)
		{
            if(f(i) + f(j) + f(i + j) == n)
            {
                //cout << i << "+" << j << "=" << i+j << endl; 
                count++;
            }
                
        }
    cout << count;

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lq1990717/article/details/126267970
————————————————
版权声明:本文为CSDN博主「君义_noip」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lq1990717/article/details/126267970
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值