Mike 发表于 2021-8-3 20:16:22

C语言 实现枚举算法策略

枚举算法本质上是搜索策略
主要用于:不定方程,排列组合,暴力算法
特点:

反思:要考虑时间,数据量不大时(对对象经行评估)

请反思这句话的涵义:对数据量的理解以及时间的理解,扬长避短的思想是要有的。


/*
function:find the special number(three number )
*/
#include<stdio.h>
int main()
{
int a;//个位
int b;//十位
int c;//百位
int i;//循环变量
for (i = 100; i <= 999; i++)
{
a = i % 10;//取到个位
b = i / 10 % 10;//取到十位
c = i / 100;//取到百位
if (a* a* a + b * b * b + c * c * c == i)
{
printf("%d ", i);
}
}
return 0;
}
百钱买百鸡问题也是如此
#include<stdio.h>
int main()
{
int x, y, z;//分别为公鸡,母鸡,小鸡
printf("公鸡 母鸡 小鸡\n");
for (x = 0; x <= 20; x++)
{
for (y = 0; y <= 33; y++)
{
for (z = 0; z <= 100; z++)//不可能超过三百,因为百钱买百鸡
{
if ((z%3==0)&&(x + y + z ==100)&& (5 * x + 3 * y + z / 3 == 100))
{
printf("%d    %d    %d\n", x, y, z);
}
}
}
}
}



优化后的程序,现在三层循环变成了一层循环,时间大大减小;
/*功能:百钱买百鸡*/
#include<stdio.h>
int main()
{
int x, y, z;//分别为公鸡,母鸡,小鸡
//根据数学知识可知公鸡最多只有14只
//联立两个方程可以消去z
for (x = 0; x <= 14; x++)
{
y = 100 - 7 * x;
if (y % 4 != 0)//右方程可知y是4的倍数
{
continue;
}
y = y / 4, z = 100 - x - y;
if (z % 3 != 0)//同理
{
continue;
}
printf("%d %d %d\n", x, y, z);
}

}

欢迎指出代码的不足之处,我很高兴你能指出我的错误。


文档来源:51CTO技术博客https://blog.51cto.com/rjgx/3255154
页: [1]
查看完整版本: C语言 实现枚举算法策略