#include <stdio.h>
int fun(int x);
int main() {
int a, b, c, m, sum=0; //sum 是用来记数的, 因此一定要初始化为0
scanf("%d", &m);
// 开始枚举(遍历) a 和 b
for(a=0; a<=1111; a++) {
for(b=0; b<=1111; b++) {
c = a+b; // 用ab来表示c,, 不用再加一层循环判断, 降低时间复杂度
/* fun 使我们自己写的子函数, 用来计算一个数所需要的的火柴棍的总数
当a使用的火柴棍根数 + b使用的火柴棍根数 + c使用的火柴棍根数之和
恰好等于m-4的时候, 则成功找出了一组解
*/
if(fun(a) + fun(b) + fun(c) == m-4) {
printf("%d + %d = %d\n", a, b, c);
sum++;
}
}
}
// 因为题目给定条件 A+B=C 与 B+A=C 视为不同的等式(A,B,C都大于0)
// 所以sum 不需要除以2
printf("一共可以拼出%d个不同的等式", sum);
getchar(); getchar();
return 0;
}
int fun(int x) {
int num = 0; // 用来计数的变量, 一定要记得初始化
int f[10] = {6, 2, 5, 5, 4 ,5, 6, 3, 7, 6};
// 用一个数组来记录 0~9 每个数字需要多少根火柴棍
while(x/10 != 0) { // 如果x/10的商不等于0 的话, 说明这个数至少有两位
// 获得x 末尾的数字, 并将此数所需要用到的火柴棍根数累加到num中
num += f[x%10]; // x%10 取出末位数字
x = x/10; //去掉x的末尾数字, 例如x的值为123则现在的x的值为12
}
// 最后加上此时x所需要用到的火柴棍的根数(此时x一定是一位数)
num += f[x];
return num; // 返回需要火柴棍的总根数
}
《啊哈算法》 火柴棍等式 P68
最新推荐文章于 2023-01-17 15:11:51 发布