评论

收藏

[C++] C语言 实现枚举算法策略

编程语言 编程语言 发布于:2021-08-03 20:16 | 阅读数:518 | 评论:0

枚举算法本质上是搜索策略
主要用于:不定方程,排列组合,暴力算法
特点: DSC0000.png
DSC0001.png
反思:要考虑时间,数据量不大时(对对象经行评估)
DSC0002.png
请反思这句话的涵义:对数据量的理解以及时间的理解,扬长避短的思想是要有的。
DSC0003.png
DSC0004.png
/*
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);
}
}
}
}
}
DSC0005.png
DSC0006.png
DSC0007.png

优化后的程序,现在三层循环变成了一层循环,时间大大减小;
/*功能:百钱买百鸡*/
#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);
}
}
欢迎指出代码的不足之处,我很高兴你能指出我的错误。


关注下面的标签,发现更多相似文章