枚举算法
就是根据提出的问题,一一列出该问题的所有解,并在逐一列出的过程中,检验每个可能解是否是问题的真正解,如果是就采纳这个解,不是就继续判断下一个。
枚举法的结构:枚举范围循环+条件判断语句
eg:
某人说:我的年龄是个两位数,我比儿子大了27岁,如果把我的年龄的两位数字交换位置,就是我儿子的年龄
计算某人年龄有多少种可能情况
#include<stdio.h>
int main(){
int a = 0;
for(int i=10;i<=99;++i)//规定年龄的取值范围[10,99]
if(i-(i%10*10+i/10) == 27){//交换年龄的个位和十位
a++;
}
printf("%d",a);
return 0;
}
eg:输出n到m的所有质数,n,m为正整数
#include<iostream>
using namespace std;
int main(){
int n,m.j;
cin >> n >> m;//读入n和m
if(n>m){
swap(n,m);//交换
}
for(j=n;j<=m;j++){//在n到m的范围中
if( j==1){//1不是质数
continue;
}
bool is_prime = true;
for(int i=2;i<j;i++){
if(j%i == 0){
is_prime = false;
break;
}
}
if(is_prime){
cout << j << endl;
}
}
return 0;
}
eg;现从5位或6位的十进制数字中找出各个数位之和等于n的回文数,输入一个整数n(10<=n<=100)
#include<iostream>
using namespace std;
int n;
int digit[6];
bool judge(int x){
int m=0,sum=0;
while(x){
digit[m++]=x%10;
sum += x%10;
x /= 10;
}
if(sum!=n){
return false;
}
for(int i=0;i<m/2;i++){
if(digit[i]!=digit[m-1-i]){
return false;
}
}
return true;
}
int main(){
bool f = false;
cin>>n;
for(int i =10000;i<1000000;i++){//因为是5位或6位
if(judge(i)){
cout<<i<<endl;
f=true;
}
}
if(!f){
cout<<-1<<endl;
}
}