目录
题目描述:
输入输出示范:
源代码:
#include<iostream>
#include<string.h>
using namespace std;
const int num[10] = { 6,2,5,5,4,5,6,3,7,6 };
//十个数字要用到的火柴棒根数,下标表原数字
bool tag[111];
int total = 4;//总用去火柴棒
void add(int x)//三种添加方式
{
if (x >= 100)
total += (num[x / 100] + num[x % 100 / 10] + num[x % 10]);
else if (x >= 10 && x < 100)
total += (num[x % 100 / 10] + num[x % 10]);
else
total += num[x];
}
int main()
{
memset(tag, true, sizeof(tag));
int n, ans = 0;
cin >> n;
for(int i=0;i<1000;++i)
for (int j = 0; j <1000; ++j)
{
add(i);
add(j);
add((i + j));
if (total == n)
{
if (i == j)
{
if (tag[i] == false)
{
total = 4;
continue;
}
else
tag[i] = false;//标记避免相同数字相加计算两遍
}
++ans;
}
total = 4;
}
cout << ans << endl;
return 0;
}
分析思路:
1.手动分析,估测加数最多只会是三位数不会是四位数,确定下循环枚举的范围。
2.用一个10大小的数组存放不同数字会用掉的火柴棒,用下标调用,下标表示原来的数字值(如0下标对应6)
3.因为相同的加数只能算一次,所以用bool数组标记去重。
4.最高位不能是0,因为两个加数和最后相加的答案都需要考虑这点,为了减少重复代码使用自定义函数add来添加一次尝试所用的总火柴棒数total。
5.学到memset函数填充内存的方法快速初始化数组。