这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战。
计算机考研复试总结-暴力求解|枚举法解决问题
枚举(所有可能的情况)
我们如何判断能否使用枚举策略?
- 分析数据量 1000MS ~ 10^7与运算量
演示1
题目描述:
设a,b,c均是O到9之间的数字,abc,bcc是两个三位数,
且有abc + bcc = 532
输入:
题目没有任何输入。
输出:
请输出所有满足题目条件的a,b,c的值。a,b,c之间用空格隔开。每个输出占一行。
分析数据量可知,我们可以使用枚举法解决问题,o(n^3大概能处理的数据量在200左右),200>10,可以适应枚举法。
abc = 100a + 10b + c
bcc = 100b + 11c
abc + bcc = 100a + 110b + 12c
C++代码解决
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
for(int a=0;a<=9;a++){
for(int b=0;b<=9;b++){
for(int c=0;c<=9;c++){
if(100*a + 110*b + 12*c==532){
printf("%d %d %d",a,b,c);
}
}
}
}
return 0;
}
演示2反序数
题目描述:
设N是一个4位数,它的9倍恰好是其反序数(如1234的反序数是4321),求N的值。
输入:
题目没有任何输入
输出:
输出题目要求的4位数,如果结果有多组,那么每组之间以回车隔开
分析4位数N,我们如果采用枚举法,从1000-9999,然后需要比较转置和原来数N的值是否为9倍关系
计算思路
- 1234 % 10 = 4 0 + 4 = 4
- 1234 / 10 = 123 4 * 10 = 40
- 123 % 10 = 3 40 + 3 =43
- 123 / 10 = 12 43 * 10 = 430
- 12 % 10 = 2 430 + 2 = 432
- 12 / 10 = 1 432 * 10 = 4320
- 1 % 10 = 1 432 * 10 = 4320
- 1 / 10 =1 4320 + 1 =4321
C++代码解决
#include<iostream>
#include<cstdio>
using namespace std;
int Reverse(int number) {
int reverseNumber = 0;
while(number != 0 ){
reverseNumber *=10;
reverseNumber += number % 10;
number/=10;
}
return reverseNumber;
}
int main(){
for(int i = 1000; i<=9999;++i){
if(i * 9 == Reverse(i)){
printf("%d\n",i);
}
}
return 0;
}
演示3对称平方数
题目描述:
打印所有不超过256,其平方具有对称性质的数。如2和11就是这样的数,因为2*2 = 4 11*11=121。
输入:
题目没有任何输入。
输出:
输出具有题目要求的性质的数,如果结果有多组,那么各组数据之间以回车隔开
- 分析复杂度:
对称平方数,这个数的平方等于平方的逆序数,满足小于256的数,输出结果,其复杂度为O(n),可以采用枚举法
C++代码解决
#include<iostream>
#include<cstdio>
using namespace std;
int Reverse(int number) {
int reverseNumber = 0;
while(number != 0 ){
reverseNumber *=10;
reverseNumber += number % 10;
number/=10;
}
return reverseNumber;
}
int main(){
for(int i =0;i<=256;++i){
if(i*i == Reverse(i*i)){
printf("%d\n",i);
}
}
return 0;
}