当前位置:首页 » 编程语言 » c语言穷举

c语言穷举

发布时间: 2023-12-27 23:16:18

c语言穷举法求最小公倍数

"对两个正整数a,b,如果若干个a之和或b之和能被b所整除或能被a所整除,则该和数即为所求的最小公倍数。"这句话分开讲会清楚一点:若干个a之和能被b所整除,或者,若干个b之和能被a所整除,那么该和数即为所求的最小公倍数。但是这个说法有个错误,这个和可能有很多,只能叫公倍数,只有最小的才是最小公倍数。
的意思举个例子:a=10,b=15。a*3
=
30,能被b=15整除,所以30是公倍数,60也行,但30是最小的,所以30是最小公倍数。如果从15看,两个15,b*2
=
30,能整除10.。。。
这段程序的过程就是模拟这个算法,先找到两个数中较大的数p,然后判断p是否能整除q,p*2是否能整除q,p*3是否能整除q。。。。。。直到找到能整除q的,就是最小公倍数了。为什么是最小呢,因为p是从小到大开始找的,第一个找到的肯定是最小公倍数。

❷ c语言中,总结穷举法适合求解的问题类型

穷举法用于数据乱序或者没有太好办法时,罗列出所有可行答案来筛选。典型的适用穷举法的编程初学问题有:百鸡问题、顺序查找、密码的暴力破解等。 穷举法的思路是,列举出所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的解答。用于解决“是否存在”和“有多少可能性”等类型问题。 穷举法一般用循环或循环嵌套结构实现,要注意循环的起点和终点,对可能的情况不能遗漏,一般也不应重复。 1、穷举法的基本思路是把问题涉及的可能情况一一罗列出来,并且根据题目的条件和实际背景逐个作出判断,从中挑选出符合条件的解答。 2、使用穷举法时,要恰当地设计变量,并且决定用哪些变量作为搜索的主线,以便穷举出所有可能情况。 3、穷举一般使用循环结构,要注意循环的起点和终点,对可能的情况不能遗漏,一般也不应重复。 4、编制程序时,还应当根据题目要求准确地写出是否符合条件的判断语句。

❸ c语言什么是穷举、递归、迭代算法

穷举法也叫枚举法或列举法。通常对于一些要求得到精确结果而所求结果又不大的时候可用此法,具体的做法就是将所有可能的情况一一举出。
程序调用自身的编程技巧称为递归。递归做为一种算法在程序设计语言中广泛应用。
代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法,即一次性解决问题。

❹ c语言的穷举法的背包问题

根据题目c1,c2是一组01组合的数组,也就是2个n位2进制数。
所以我的代码逻辑就是,c1,c2初值分别是00000....以及111111....,之后循环执行c1+1;c2-1(2进制加减运算),最大执行次数2的n次方-1(n位2进制数最大数)

代码实现功能,穷举所有可能方案,返回:第一个/最后一个找到的可行方案。

函数intqj(BAGc1,BAGc2,intn,int*bws,intflag);
当flag=1返回第一个可行方案,flag=0查找所有方案并返回最后一个可行方案
我测试时,flag传值0,需要自己改!!

由于迭代顺序,同样实验数据,返回的结构和你案例结构不一样,我在下图标注了。

#include<stdio.h>
#include<math.h>
#include<malloc.h>
#include<string.h>
typedefstructbag
{
intbweight;
char*books;
}BAG;
intqj(BAGc1,BAGc2,intn,int*bws,intflag);//穷举所有n位2进制组合,返回最后一个可行方案(可能有多个方案)。
//参数:c1背包1,c2背包2,n书本个数,bws所有书本重量,标识:flag=1找到第一个可行方案截止,flag=0查找所有方案
intcheckOverLoad(BAGc1,BAGc2,int*bws,intn);
voidadd2(char*nums);//2进制字符串+1运算
voidsub2(char*nums);//2进制字符串-1运算
intmain()
{
BAGc1,c2;
inti,n,*bws,sum=0;
printf("请输入两个背包的最大载重: ");
scanf("%d%d",&c1.bweight,&c2.bweight);
printf("请输入书本的数量: ");
scanf("%d",&n);
c1.books=(char*)malloc(sizeof(char)*(n+1));
c2.books=(char*)malloc(sizeof(char)*(n+1));
c1.books[0]=0;
c2.books[0]=0;
bws=(int*)malloc(sizeof(int)*n);
while(1)
{
sum=0;
printf("请输入每本书的重量: ");
for(i=0;i<n;i++)
{
scanf("%d",&bws[i]);
sum+=bws[i];
}
if(sum<=c1.bweight+c2.bweight)
break;
else
printf("书本重量和超过背包负重和!请重新输入 ");
}


qj(c1,c2,4,bws,0);
//------------------------------打印结果-----------------------------
printf(" 输出: ");
printf("book");
for(i=0;i<n;i++)
printf("%d",bws[i]);
printf(" ");
printf("c1%s ",c1.books);
printf("c2%s ",c2.books);
}
intqj(BAGc1,BAGc2,intn,int*bws,intflag)//穷举所有n位二进制数,
{
inti,max=(int)pow(2,n)-1;

char*nums1,*nums2;
nums1=(char*)malloc(sizeof(char)*(n+1));
nums2=(char*)malloc(sizeof(char)*(n+1));

printf("---------开始穷举所有可能的组合---------- ");
memset(c1.books,'0',n);
memset(c2.books,'1',n);
c1.books[n]=c2.books[n]=0;
printf("%s ",c1.books);
printf("%s ",c2.books);
if(checkOverLoad(c1,c2,bws,n)==0)
{
memset(nums1,0,n+1);
memset(nums2,0,n+1);
strcpy(nums1,c1.books);
strcpy(nums2,c2.books);
if(flag==1)
return0;
}
printf(" ");
for(i=0;i<max;i++)
{
add2(c1.books);
sub2(c2.books);
printf("%s ",c1.books);
printf("%s ",c2.books);
if(checkOverLoad(c1,c2,bws,n)==0)
{
memset(nums1,0,n+1);
memset(nums2,0,n+1);
strcpy(nums1,c1.books);
strcpy(nums2,c2.books);
if(flag==1)
return0;
}
printf(" ");
}
printf("-----------------穷举结束------------------ ");
memset(c1.books,0,n+1);
memset(c2.books,0,n+1);
strcpy(c1.books,nums1);
strcpy(c2.books,nums2);
free(nums1);
free(nums2);
return0;
}
voidadd2(char*nums)//2进制字符串加1
{
inti,n=strlen(nums),jin=0;
for(i=n-1;i>=0;i--)
{
if(nums[i]=='0'&&i==n-1)
{
nums[i]='1';
break;
}
elseif(nums[i]-'0'+jin==1&&i<n-1)
{
nums[i]='1';
break;
}
else
{
jin=1;
nums[i]='0';
}
}
}
voidsub2(char*nums)//2进制字符串减1
{
inti,n=strlen(nums),j=0;
for(i=n-1;i>=0;i--)
{
if(nums[i]=='1'&&i==n-1)
{
nums[i]='0';
break;
}
elseif(nums[i]-'0'-j==0&&i!=n-1)
{
nums[i]='0';
break;
}
else
{
nums[i]='1';
j=1;
}
}
}
intcheckOverLoad(BAGc1,BAGc2,int*bws,intn)//检查是否超载。超载返回1,否返回0
{
inti,sum1=0,sum2=0;
for(i=0;i<n;i++)
if(c1.books[i]=='1')
sum1=sum1+bws[i];
else
sum2=sum2+bws[i];
if(sum1>c1.bweight)
{
printf("背包1超载! ");
return1;
}
if(sum2>c2.bweight)
{
printf("背包2超载! ");
return1;
}
printf("方案可行! ");
return0;
}

热点内容
怎么看pppoe密码 发布:2024-11-30 08:35:35 浏览:509
sandisk16gb存储卡 发布:2024-11-30 08:34:42 浏览:953
eclipsejava反编译 发布:2024-11-30 08:34:37 浏览:899
yy静态头像源码 发布:2024-11-30 08:30:21 浏览:680
javaparseint 发布:2024-11-30 08:23:12 浏览:909
抖音密码箱保险在哪里 发布:2024-11-30 08:10:43 浏览:998
广告文学脚本格式 发布:2024-11-30 08:09:57 浏览:634
期末到了解压的方法 发布:2024-11-30 07:53:49 浏览:865
sqlce数据库 发布:2024-11-30 07:41:21 浏览:726
奇瑞5x配置如何 发布:2024-11-30 07:39:50 浏览:642