啊哈算法--火柴棍问题

啊哈算法–火柴棍问题
代码如下:
#include <stdio.h>
#include <stdlib.h>
int f(int x);

int main()
{
int a,b,c;//表示等式中的数字
int m;//火柴棍总数
int sum=0;//记录总共有多少个等式
printf(“请输入火柴棍总数:\n”);
scanf("%d",&m);
for(a=0;a<=11111;a++)
for(b=0;b<=11111;b++)
{
c=a+b;
if(f(a)+f(b)+f©==m-4)
{
printf("%d+%d=%d\n",a,b,c);
sum++;
}
}
printf(“总共有%d个等式”,sum);
return 0;
}
int f(int x)
{
int num=0;//统计这个数字的所用火柴棍数
int f[10]={6,2,5,5,4,5,6,3,7,6};
while(x/10!=0)
{
num=num+f[x%10];
x=x/10;
}
num=num+f[x];
return num;
}
几点总结:
1 设计枚举时,如果是等式关系,那么一个 自然的想法是枚举前两个数,然后用前两个数计算出第三个数。可以大大减少时间复杂度。
2 写程序时,一个一般的思路:先设计好数据结构,再去设计用到的逻辑。读别人的代码时也是如此,尽量区分数据结构层与逻辑层,思考每一个变量存在的意义。
3 枚举也是需要思考的。不如说越是枚举就越是需要思考。总共m根火柴棍,加号和等号用去四根,剩下三个数用去m-4根;为减少枚举量,只枚举前两个数,第三个数用前两个数算出来;确定每个数的枚举范围:m上限24,也就是三个数字可用火柴棍数上限20,要想找到所有解,就要保证每个数枚举范围合理的范围内尽可能大,0到9这几个数中用火柴棍最少的是1(2根),尽可能枚举多的位数(枚举两个数,一个数就是10根,一个1用去2根,最多5个1,也就是每个数最多只能到11111),因为位数多肯定比数字大来的更快。(关于这点我怀疑书上的代码是有错误的,因为书上直到1111.还是我没想明白/?欢迎评论指正)
4 关于枚举,总结一般的思维:
1 枚举几个对象是最少的?对象间都有什么关系可以利用?
2 枚举范围?每个对象的范围是否一样?哪些信息可以利用?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值