枚举算法,也称为穷举算法它是编程中常用的一种算法。在解决某些问题时,可能无法按照一定规律从众多的候选答案中找到正确答案。此时,可以从众多的候选解中逐一取出候选答案,并验证候选答案是否为正确的解。我们将这种方法称为枚举法。
枚举法的缺点:运算量比较大,解题效率不高。如果枚举范围太大,在时间上就难难以承受。优点:思路简单,编程编写和调试方便。
判断n能否被3、5、7整除
输入一个正整数n,判断n是否能被3、5、7整除,并输出以下信息:
(1)能同时被3、5、7整除。
(2)能被其中两个数(要指出是哪两个)整除。
(3)能被其中一个数(指出是哪一个)整除。
(4)不能被3、5、7任何一个整除。
【分析】
本题可以用简单的if-else选择语句嵌套结构判断n是否能被3、5、7整除。
代码如下:
if(n%3==0 && n%5==0 && n%7==0)
printf("该整数能被3、5、7整除");
else if(n%3==0 && n%5==0 && n%7!=0)
printf("该整数能被3、5整除");
else if(n%3==0 && n%5!=0 && n%7==0)
printf("该整数能被3、7整除");
else if(n%3!=0 && n%5==0 && n%7==0)
printf("该整数能被5、7整除");
else if(n%3==0 && n%5!=0 && n%7!=0)
printf("该整数只能被3整除");
else if(n%3!=0 && n%5==0 && n%7!=0)
printf("该整数只能被5整除");
else if(n%3!=0 && n%5!=0 && n%7==0)
printf("该整数只能被7整除");
else
printf("该整数不能被3、5、7任何一个整除");
上述方法使用了很多条件语句,结构不是很清晰。除了上述方法,还可以结合二进制的性质利用枚举法求解,具体方法如下:
如果将n能被整除用1表示,不能被整除用0表示。用3位二进制数表示n是否则被3、5、7整除。例如1即(001)表示能被7整除,4即(100)表示能被3整除,6即(110)表示能被3和5同时整除,如图所示。
从图中可以看出,共有八种情况。未来网表示二进制数,需要定义3个变量c1、c2、c3,分别表示是否能被3、5、7整除。
code:
#include<stdio.h>
#include<iostream>
void main()
{
int n,c1,c2,c3;
printf("请输入一个整数:");
scanf("%d",&n);
c1 = n%3 ==0;
c2 = n%5 ==0;
c3 = n%7 ==0;
switch((c1<<2)+(c2<<1)+c3)
{
case 0:
printf("不能被3,5,7整除.\n");
break;
case 1:
printf("只能被7整除.\n");
break;
case 2:
printf("只能被5整除.\n");
break;
case 3:
printf("可以被5,7整除.\n");
break;
case 4:
printf("只能被3整除.\n");
break;
case 5:
printf("可以被3,7整除.\n");
break;
case 6:
printf("可以被3,5整除.\n");
break;
case 7:
printf("可以被3,5,7整除.\n");
break;
}
system("pause");
}
结果: