目录
题目
【题目描述】
给你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,刚好用完25根火柴,题目要求小于等于24根,可以用这个作为for循环临界值。
#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