P1149 [NOIP2008 提高组] 火柴棒等式
P1149 [NOIP2008 提高组] 火柴棒等式
题目
给你
注意:
- 加号与等号各自需要两根火柴棍;
- 如果
,则 与 视为不同的等式( ); 根火柴棍必须全部用上。
输入
一个整数
输出
一个整数,能拼成的不同等式的数目。
样例 1
输入
14
输出
2
样例 2
输入
18
输出
9
提示
【输入输出样例 1 解释】
【输入输出样例 2 解释】
思路一
首先,根据题意可知,火柴棒的个数最多为
代码
#include <bits/stdc++.h>
using namespace std;
int a, b, c, m, sum;
int f(int x) // 用来计算一个数需要用火柴棍的总数
{
int s = 0, f[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
while (x / 10 != 0)
{
s += f[x % 10];
x /= 10;
}
s += f[x]; // 加上最后的数字对应的根数
return s; // 返回火柴棍的总跟数
}
int main()
{
cin >> m;
for (a = 0; a <= 1111; a ++ )
{
for (b = 0; b <= 1111; b ++ )
{
c = a + b;
if (f(a) + f(b) + f(c) == m - 4)
sum ++;
}
}
cout << sum << '\n';
return 0;
}
思路二
上述算法的时间复杂度位
代码
#include <bits/stdc++.h>
using namespace std;
int f[2500] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6}, a, b, c, m, sum;
int main()
{
cin >> m;
for (int i = 10; i <= 2222; i ++ )
f[i] = f[i / 10] + f[i % 10];
for (a = 0; a <= 1111; a ++ ) // 枚举 a 和 b
{
for (b = 0; b <= 1111; b ++ )
{
c = a + b;
if (f[a] + f[b] + f[c] == m - 4)
sum ++;
}
}
cout << sum << '\n';
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理