题意:
给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数。
火柴棍数如下
注意:
- 加号与等号各自需要两根火柴棍
- 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)
- n根火柴棍必须全部用上
这个题就是暴力枚举
先把每个数字的火柴棍数写出来
int tr[10] = {
6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
要想满足题意就得满足两个条件
1.A + B = C这个数学等式得成立
2.就是得满足A的火柴棍数 + B的火柴棍数 + C的火柴棍数 = n - 4 (4 是指加好和等号的火柴棍数)
然后就直接写暴力判断,本来我写的是三个循环,就是每个循环一个数ABC,结果时间太长了,等半天也不出结果
后来发现写两个就可以 因为 i + j 就等于第三个数C,所以就把两个判断缩减成一个了,就f(i + j) == n - 4 - f(i) - f(j)(巧妙吧……)
还有一点就是枚举的次数 有点东西,就是你写出来那个火柴棍的个数会发现,7是三个,就有可搞性,比如771 + 1 = 772,共23个,没超,所以这个范围得到800就差不多了,你也不能为了省事无限弄大,万一就超时了呢……
#include<bits/stdc++.h>
using namespace std;
int tr[11] = {
6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
int f(int x)
{
int sum = 0;
if(x < 10)
return tr[x % 10];
else
{
while(x)
{
sum += tr[x % 10];
x = x / 10;
}
return sum;
}
}
int main()
{
int n;
int ans = 0;
cin>>n;
n = n - 4;
for(int i = 0; i <= 800; i++)
{
for(int j = 0; j <= 800; j++)
{
if(f(i + j) == n - f(i) - f(j))
ans++;
}
}
cout<<ans;
}