算法1
(暴力枚举) $O(n^2)$
这个题我们可以直接使用一个函数来返回每个数的需要的火柴数目,然后我们对函数相加做一个判断即可。n最大值为24,那么我们去除掉+=的4个,就只有20个,在去掉一个一位数最少为1,只有18个火柴棒,平均分配到两个数的话,必定是一个4位数,我们假定a为最小的a1111(8)+b1=c(1112)>24同理可得a的最大值肯定是不会超过1111的,所以我们枚举a和b的时候枚举到1111就可以了。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
int nums[10]={6,2,5,5,4,5,6,3,7,6}; //每个数字需要多少个火柴棒
int k[10010];
int f(int x) //每个数需要的火柴数目
{
int res=0;
int t=x;
while(x)
{
res+=nums[x%10];
x/=10;
}
if(t==0) //如果这个数是0
res=6;
return res;
}
int main()
{
int res=0;
int n;
cin>>n;
for(int i=0;i<=1111;i++) //枚举所有可能的数
for(int j=0;j<=1111;j++)
if(f(i)+f(j)+f(i+j)+4==n)
{
res++;
}
cout<<res<<endl;
return 0;
}
大佬我有个疑问,如果是i = 1 ,j=1 那么这种情况会不会被重复计数
不会重复计数哈,因为i是单调递增的
确实,谢谢啦
%%%还是不太懂1111😂
1111就是个估计值,就像111+1就等于112只有17根火柴棒,那么我们就再多估计一位。
😅我再想想,xiexie