C语言穷举法经典例题
穷举算法及解题

穷举算法及解题
例12-1 古希腊人认为因子的和等于它本身的数是一个完全数(自身因子除外),例如28的因子是1、
2、4、7、14,且1+2+4+7+14=28,则28是一个完全数,编写一个程序求2~1000内的所有完全数。 问题分析
(1) 本题是一个搜索问题,搜索范围2~1000,找出该范围内的完全数;
(2) 完全数必须满足的条件:因子的和等于该数的本身;
(3) 问题关键在于将该数的因子一一寻找出来,并求出因子的和:分解因子的方法比较简单,采用循环完成分解因子和求因子的和。
程序如下:
program p12_1;
var a,b,s:integer;
program jitu;
var
a,b,c,d,e,f,x,y:integer;
begin
for a:=2 to 6 do
for b:=1 to 6 do
for c:=1 to 6 do
for d:=2 to 6 do
for e:=1 to 6 do
begin
f:=21-a-b-c-d-e;
Var a,b,c,d:integer;
X,x0,x1,x2,x3,x4:integer;
st1:set of 1..100;
function number(a,b,c,d:integer):integer;
var n1,n2,n3,n4,sum:integer;
begin
st1:=[];
2、有一个三位数,个位数字比百位数字大,而百位数字又比十位数字大,并且各位数字之和等于各位数字相乘之积,求此三位数。
用穷举法求解问题的实践示例

利用穷举法解决问题一、填空题解决问题常见的算法有:解析法、穷举法、递归法、冒泡排序法,根据问题选择合适的算法。
1. 列举所有可能的情况,逐个判断有哪些是符合问题所需要的条件,从而得到问题的解答,这是的思路。
2、水仙花数是一个三位数,其各位数字的立方和等于该数本身,如333153153=++,要找出所有的水仙花数,选择的算法是。
3、一张单据上有一个5位数的号码67__ __8,其中百位和十位的数字看不清楚了,但知道该数能够被78整除,也能被67整除,求出该号码。
应该选择的算法是。
4. “百钱买百鸡”问题:已知公鸡每只5元,母鸡每只3元,每3只小鸡1元,用100元买100只鸡,问每种鸡应各买多少?应该选择的算法是。
二、分析程序写出运行结果或补全程序。
1、“百钱买百鸡”问题:已知公鸡每只5元,母鸡每只3元,每3只小鸡1元,用100元买100只鸡,问每种鸡应各买多少?(1)使用三重循环,代码如下:Private Sub Command1_Click()Dim x As Integer, y As Integer, z As IntegerFor x = 0 To 20For y = 0 To 33For z = 0 To 99 Step 3If ThenPrint "公鸡"; x, "母鸡"; y, "小鸡"; zEnd IfNextNextNextEnd Sub(2)使用二重循环,程序如下:Private Sub Command1_Click()Dim x As Integer, y As Integer, z As IntegerFor x = 0 To 20For y = 0 To 33z =If ThenPrint "公鸡"; x, "母鸡"; y, "小鸡"; zEnd IfNextNextEnd Sub2、一张单据上有一个5位数的号码67__ __8,其中百位和十位的数字看不清楚了,但知道该数能够被78整除,也能被67整除,求出该号码。
c语言穷举法傻瓜教程

穷举法1.密码箱问题#include<stdio.h>main(){int i,key;printf("请设定旅行箱的密码(000-999):"); scanf("%d",&key);printf("\n你的旅行箱密码是:");for(i=0;i<=999;i++)if(i==key)if(i<10)printf("%d\n",i);else if(i<100)printf("%d\n",i);else printf("%d\n",i);}2.百钱买百鸡问题#include<stdio.h>main(){int i , j , k;/*准备输出格式*/printf("\t公鸡\t母鸡\t小鸡\n");for(i=0;i<=20;i++)for(j=0;j<=33;j++){k=100-i-j;if(k%3==0 && i*5+j*3+k/3==100) printf("\t%d\t%d\t%d\n",i ,j ,k); }}例 2 :36 块砖,36 人搬。
男搬 4 ,女搬 3 ,两个小儿抬一砖。
要求一次全搬完。
问需男、女、小儿各若干(必须都有)?请同学们先分析第一步:问题所涉及的情况;analysis:都男的搬,需9人;都女的搬,需12人,都小孩搬,需72人;小孩书需要是2的整数倍;解:#include<stdio.h>main(){int i,j,k;for(i=0;i<=9;i++)for(j=0;j<=12;j++){k=36-i-j;//消去参数需放在最后一个for循环里面if(k%2==0&&i*4+j*3+k*0.5==36)printf("%d\t%d\t%d\n",i,j,k);}作业:换零钞问题:一张100元,换成20,10,5,1面值的零钞,每种至少一张,共有哪些换法,总计多少种换法?都换20:5张;----i都换10:10张;----j都换5:20张;----k都换1:100张----tt=100-i-j-k;解:#include<stdio.h>main()int i,j,k,t;for(i=1;i<=5;i++)for(j=1;j<=10;j++)for(k=1;k<=20;k++){t=100-i*20-j*10-k*5;if(i*20+j*10+k*5+t==100&&t>0)printf("%d\t%d\t%d\t%d\n",i,j,k,t);}}2.从1到100的自然数中,每次取出两个数,要使它们的和大于100,共有哪些取法,总计多少种取法?#include<stdio.h>main(){static int count=0;int i,j;for(i=1;i<=100;i++)for(j=1;j<=100;j++){if((i+j)>100&&j!=i){count++;printf("i=%d\tj=%d\n",i,j);}}printf("循环次数为%d\n",count);}。
C语言中用穷举法实现的几个问题

C语言中用穷举法实现的几个问题1.百鸡问题(零钱换整钱也是这类问题):用100元买100只鸡,大公鸡5元1只,母鸡3元1只,小鸡1元3只。
问各能买多少只?分析:把公鸡、母鸡、小鸡只数分别设为未知数gj、mj、xj,则三个未知数有如下一些情况:gj:1--20 mj:1--33 xj:1--100,并且它们须符合以下条件:gj+mj+xj=100,同时5*gj+3*mj+xj/3=100.程序编写如下:解法一:#include <stdio.h>#include <stdlib.h>void main(){int gj,mj,xj,count=0;for(gj=0;gj<=20;gj++)for(mj=0;mj<=33;mj++){xj=100-gj-mj;if(15*gj+9*mj+xj==300){printf("\n公鸡:%4d 母鸡:%4d 小鸡:%4d\n",gj,mj,xj);count++;}}printf("\n共计有%d种买法!\n",count);system("pause");}解法二:#include <stdio.h>#include <stdlib.h>void main(){int gj,mj,xj,count=0;for(gj=0;gj<=20;gj++)for(mj=0;mj<=33;mj++)for(xj=0;xj<=100;xj++)if((gj+mj+xj==100)&&(15*gj+9*mj+xj==300)){printf(" 公鸡:%4d 母鸡: %4d 小鸡: %4d\n",gj,mj,xj);count++;}printf("共计%d有种买法!\n",count);system("pause");}2.某处发生一起案件,侦察得知如下可靠线索:ABCD四人都有作案可能,AB中至少一人参与作案,BC中至少一人参与作案,CD中至少一人参与作案,AC中至少一人未参与作案。
穷举算法及解题

穷举算法及解题穷举算法及解题例12-1 古希腊人认为因子的和等于它本身的数是一个完全数(自身因子除外),例如28的因子是1、2、4、7、14,且1+2+4+7+14=28,则28是一个完全数,编写一个程序求2~1000内的所有完全数。
问题分析(1)本题是一个搜索问题,搜索范围2~1000,找出该范围内的完全数;(2)完全数必须满足的条件:因子的和等于该数的本身;(3)问题关键在于将该数的因子一一寻找出来,并求出因子的和:分解因子的方法比较简单,采用循环完成分解因子和求因子的和。
程序如下:program p12_1;var a,b,s:integer;beginfor a:=2 to 1000 dobegins:=0;for b:=1 to a-1 doif a mod b =0 then s:=s+b;if a=s then beginwrite(a,'=',1,);for b:=2 to a-1 doif a mod b=0 then write('+',b);writeln;end;end;end.当程序运行后,输出结果:6=1+2+328=1+2+4+7+14496=1+2+4+8+16+31+62+124+248例12-3邮局发行一套票面有四种不同值的邮票,如果每封信所帖邮票张数不超过三枚,存在整数r,使得用不超过三枚的邮票,可以贴出连续的整数1、2、3、……、r来,找出这四种面值数,使得r值最大。
问题分析:本题则是知道每封信邮票数的范围(<=3),邮票有四种类型,编程找出能使面值最大邮票。
其算法是:(1) 面值不同的四种邮票,每封信所贴邮票不超过3张;(2) 用这四种邮票贴出连续的整数,并且使r值最大;(3) 用穷举法,找出所有符合条件的解;(4) 本题用集合的方法统计邮票的面值,提高判重的速度。
设四种邮票的面值分别为:a,b,c,d,根据题意设:a<b<c<d,因此a=1,用循环语句完成搜索。
C语言程序设计---穷举法

目录
后退
前进
结束
江苏省高淳职教中心校 张建青
我国古代数学家张丘建在《算经》 例 1 : 我国古代数学家张丘建在《算经》中出 了这样一道题目:鸡翁一,值五钱,鸡母一, 了这样一道题目:鸡翁一,值五钱,鸡母一,值 三钱,鸡雏三,值一钱,百钱买百鸡,问鸡翁、 三钱,鸡雏三,值一钱,百钱买百鸡,问鸡翁、 鸡母、鸡雏各几何? 鸡母、鸡雏各几何?
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
我们将条件方程改变一下: 我们将条件方程改变一下: k=100 - i - j i *5+j *3+k/3==100
如此,便不再需要k循环了 如此,便不再需要 循环了
目录
后退
前进
结束
江苏省高淳职教中心校 张建青
改进后的程序
#include<stdio.h> main() { int i , j , k; /*准备输出格式 准备输出格式*/ 准备输出格式 printf("\t公鸡 母鸡 小鸡 公鸡\t母鸡 小鸡\n"); 公鸡 母鸡\t小鸡 for(i=0;i<=20;i++) for(j=0;j<=33;j++) { k=100-i-j; if(i*5+j*3+k/3==100) printf("\t%d\t%d\t%d\n" ,i ,j ,k); } }
穷举法的思路
穷举算法是程序设计中使用得最为普遍、 大家必须熟练掌握和正确运用的一种算法。 它利用计算机运算速度快、精确度高的特 点,对要解决问题的所有可能情况,一个 不漏地进行检查,从中找出符合要求的答 案。
目录
c语言穷举法经典例题

c语言穷举法经典例题穷举法是一种常用的计算机算法,用于遍历所有可能的解决方案以找到最佳解决方案。
在C语言中,穷举法经常被用来解决一些经典的例题。
本文将介绍三个常见的C语言穷举法经典例题,并给出相应的解决方法。
1. 例题一:找出100以内的所有素数要求:编写一个程序,找出100以内的所有素数。
解决思路:穷举法通过考察每个数,判断其是否满足某个条件,来找出符合条件的解。
对于找素数的问题,我们可以从2开始,逐个判断每个数是否为素数。
如果一个数不是素数,那么它一定可以被一个小于它的数整除。
因此,我们可以用两个循环来实现穷举法的思想。
```c#include <stdio.h>int main() {int i, j;for (i = 2; i <= 100; i++) {int isPrime = 1; // 假设当前数为素数for (j = 2; j < i; j++) {if (i % j == 0) {isPrime = 0; // 当前数不是素数break;}}if (isPrime) {printf("%d ", i);}}return 0;}```以上代码中,外层循环遍历从2到100的所有数,内层循环用来判断当前数是否为素数。
如果当前数能够被除1和自身以外的数整除,则将isPrime标记为0,表示不是素数。
最后,打印出所有素数的值。
2. 例题二:猜数字游戏要求:编写一个猜数字的游戏,随机生成一个1到100的整数,玩家通过输入数字来猜测,直到猜中为止,给出总共猜了多少次。
解决思路:穷举法可以通过循环来逐个尝试所有可能的选择,直到找到解决方案。
对于猜数字游戏,我们可以利用rand()函数来生成一个伪随机数字,并与玩家的猜测进行比较,直到猜中为止。
```c#include <stdio.h>#include <stdlib.h>#include <time.h>int main() {srand(time(0)); // 初始化随机数生成器int target = rand() % 100 + 1; // 生成1到100之间的随机数int guess, count = 0;do {printf("请输入你猜测的数字:");scanf("%d", &guess);if (guess > target) {printf("太大了!\n");} else if (guess < target) {printf("太小了!\n");}count++;} while (guess != target);printf("恭喜你,猜对了!总共猜了%d次。
c语言穷举法经典例题

c语言穷举法经典例题一、引言穷举法是一种常见的编程方法,通过逐个测试所有可能的选项,以确定满足特定条件的解决方案。
这种方法在许多问题中都有应用,例如数独、斐波那契数列、判断一个数是否为素数等。
本篇文章将介绍几个C语言中的经典穷举法例题,帮助您更好地理解这一方法的应用。
二、经典例题1. 数独求解问题描述:给定一个9x9的数独网格,要求找出满足规则的所有解。
规则为每个数字只能出现一次。
代码实现:```c#include <stdio.h>#include <stdlib.h>int main() {int board[9][9]; // 数独网格int i, j;int solutions = 0; // 记录解的数量// 穷举所有可能的情况for (i = 0; i < 9; i++) {for (j = 0; j < 9; j++) {// 逐个尝试数字1到9board[i][j] = 1 + rand() % 8; // 使用随机数字以增加难度 // 检查当前数字是否满足规则for (int k = 0; k < i * 3 + j * 3 + 1; k++) { // 检查周围3x3的格子是否有重复数字if (board[i + k / 3][j + k % 3] == board[i][j]) { // 检查上方是否有重复数字board[i][j] = -1; // 如果重复则标记为无效数字,跳过下一个循环break;}}if (board[i][j] != -1) { // 如果当前数字满足规则,则增加解的数量并继续下一个循环solutions++;}}}// 输出解的数量并结束程序printf("Number of solutions: %d\n", solutions);return 0;}```这段代码通过穷举所有可能的情况,检查每个数字是否满足规则,最终找到所有符合规则的解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编程思路:
如何找到该人,一定是“先假设该人是做好事者,然后到每句话中去测试看有几句是真话”。 “有三句是真话就确定是该人,否则换下一人再试”。
比如,先假定是A同学,让 thisman='A';
代入到四句话中
A说:thisman!=‘A’;
‘A’!=‘A’
假,值为0。
B说:thisman==‘C’;
这时,我们可以理出头绪,要用枚举法,一个人一个人地去试,四句话中有三句为真,该人即所求。
#include<stdio.h>
void main( )
{
char thisman;
int sa,sb,sc,sd,cond;
for (thisman='A'; thisman<='D'; thisman++)
printf("cocks=%d,hens=%d,chickens=%d\n",x,y,z);
}
}
优化
【讨论】 令z=100-x-y 只进行101×101= 10201 次运算(前者的1%)
继续优化
void main()
{ int x,y,z; for (x=0;x<=14;x++)
取x<=14,y<=25 只进行15×26= 390 次运 算
穷举法求解韩信点兵:方案1-goto
#include <stdio.h> void main() {
int x;
for (x=1; ;x++) {
if (x%5==1 && x%6==5 && x%7==4 && x%11==10) {
printf(" x = %d\n", x); goto END; } } END: ; }
4、委派任务:某侦察队接到一项紧急任务,要求在A、B、C、D、E、F六个队员中尽可能多地挑若干 人,但有以下限制条件:
A和B两人中至少去一人; A和D不能一起去; A、E和F三人中要派两人去; B和C都去或都不去; C和D两人中去一个; 若D不去,则E也不去。 问应当让哪几个人去?
5、在下面的加法算式中,不同的符号代表不同的数字,相同的符号代表相同的数字。请设计程序求出" 都、要、学、C"4个符号分别代表的数字。提示:让计算机解奥数题。穷举"都、要、学、C"4个符号分 别代表的数字(从0到9),然后进行组合,如果组合起来符合规则(不同的符号代表不同的数字,相同 的符号代表相同的数字,且使等式成立),则为正解。
穷举法求解韩信点兵:方案2-break
#include <stdio.h> void main() {
int x;
for (x=1; ;x++) {
if (x%5==1 && x%6==5 && x%7==4 && x%11==10) {
printf(" x = %d\n", x); break; } } }
结果:x=0,y=25,z=75 x=4,y=18,z=78 x=8,y=11,z=81 x=12,y=4,z=84
{
if (z%3==0 &&x+y+z==100 && 5*x+3*y+z/3==100 )
printf("x=%d,y=%d,z=%d\n",x,y,z);
}
}
【讨论】 此为“最笨”之法——要进行101×101×101= 1030301次(100多万次)运算。
穷举法求解韩信点兵
#include <stdio.h> void main() {
int x;
for (x=1; ;x++) {
if (x%5==1 && x%6==5 && x%7==4 && x%11==10) {
printf(" x = %d\n", x); } } } /*死循环——永远不会退出的循环*/
6、警察局抓住了A、B、C、D四名盗窃嫌疑犯,其中只有一人是小偷。在审问时,A说:“我不是小 偷”;B说:“C是小偷”;C说:“小偷肯定是D”;D说:“C在冤枉好人”。现在已经知道这四人中 有三人说的是真话,一人说的是假话。请问到底谁是小偷?
void main()
{ int x,y,z; for (x=0;x<=100;x++)
取x<=20,y<=33 只进行21×34= 714 次运 算(第1种运算的6.9e-4)
for (y=0;y<=100;y++)
{
z=100-x-y;
if (z%3==0 && 5*x+3*y+z/3==100 )
‘A’==‘C’
假,值为0。
C说:thisman==‘D’;
‘A’==‘D’
假,值为0。
D说:thisman!=‘D’;
‘A’!=‘D’
真,值为1。
显然,不是'A'做的好事(四个关系表达式值的和为1)
再试B同学,让thisman=‘B’;
代入到四句话中
A说:thisman!=‘A’; ‘B’!=‘A’
for (y=0;y<=25;y++)
if (7*x+4*y==100 )
{
z=100-x-y;
printf("cocks=%d,hens=%d,chickens=%d\n",x,y,z);
}
}
课堂讨论:谁做的好事?
有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。 A说:不是我。 B说:是C。 C说:是D。 D说:C胡说。 已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出做了好事的人。
{
sa=(thisman != 'A');
sb=(thisman == 'C');
sc=(thisman == 'D');
sd=(thisman != 'D');
cond=sa+sb+sc+sd;
if (cond==3)
printf("做好事的人是:%c\n", thisman);
}
}பைடு நூலகம்
利用穷举法求解趣味智力题
A说:thisman!=‘A’; ‘C’!=‘A’
真,值为1。
B说:thisman==‘C’; ‘C’==‘C’
真,值为1。
C说:thisman==‘D’; ‘C’==‘D’
假,值为0。
D说:thisman!=‘D’; ‘C’!=‘D’ 真,值为1。
显然,就是‘C’做了好事(四个关系表达式值之和为3)
穷举法求解韩信点兵
#include <stdio.h> void main() {
int x;
for (x=1; x < 5000 ;x++) {
if (x%5==1 && x%6==5 && x%7==4 && x%11==10) {
printf(" x = %d\n", x); } } } /*属于“瞎猫碰死耗子”的做法*/
真,值为1。
B说:thisman==‘C’; ‘B’==‘C’
假,值为0。
C说:thisman==‘D’; ‘B’==‘D’
假,值为0。
D说:thisman!=‘D’; ‘B’!=‘D’
真,值为1。
显然,不是'B'所为(四个关系表达式值的和为2)
再试C同学,让thisman=‘C’;
代入到四句话中
穷举法求解韩信点兵:方案3-标志变量
#include <stdio.h> void main() {
int x; int find = 0;
/*设置找到标志为假*/
for (x=1; !find ;x++) {
if (x%5==1 && x%6==5 && x%7==4 && x%11==10) {
(韩信点兵) 韩信有一队兵,他想知道有多少人,便让士兵排队报数。按从1至5报数,最末一个士兵报的数为1;按从1至 6报数,最末一个士兵报的数为5;按从1至7报数,最末一个士兵报的数为4;最后再按从1至11报数,最末一 个士兵报的数为10。你知道韩信至少有多少兵吗?
设兵数为x,则x应满足: x%5 == 1 && x%6 == 5 && x%7 == 4 && x%11 == 10 穷举法对x从1开始试验
printf(" x = %d\n", x); find = 1; } } }
练习题 1、试编程求出100000~200000之间间隔最大的两个素数并输出,同时输出最大间隔。 2、试编程求出八位数中所有的水仙花数。三位水仙花为 abc=a^3+b^3+c^3,八位数水仙花为该数字等 于所有位数的八次方之和。 3、年龄几何:张三、李四、王五、刘六的年龄成一等差数列,他们四人的年龄相加是26,相乘是880, 求以他们的年龄为前4项的等差数列的前20项。
printf("x=%d,y=%d,z=%d\n",x,y,z);
}