计算机考研复试总结-暴力求解|枚举法解决问题

308 阅读2分钟

这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战

计算机考研复试总结-暴力求解|枚举法解决问题

枚举(所有可能的情况)

我们如何判断能否使用枚举策略?

  • 分析数据量 1000MS ~ 10^7与运算量

演示1

题目描述:


设a,b,c均是O到9之间的数字,abc,bcc是两个三位数, 且有abc + bcc = 532
输入:
题目没有任何输入。
输出:
请输出所有满足题目条件的a,b,c的值。a,b,c之间用空格隔开。每个输出占一行。

image.png

分析数据量可知,我们可以使用枚举法解决问题,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;
}

image.png

演示2反序数

题目描述:

设N是一个4位数,它的9倍恰好是其反序数(如1234的反序数是4321),求N的值。

输入:

题目没有任何输入

输出:

输出题目要求的4位数,如果结果有多组,那么每组之间以回车隔开

image.png

分析4位数N,我们如果采用枚举法,从1000-9999,然后需要比较转置和原来数N的值是否为9倍关系

image.png 计算思路

- 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

输入:

题目没有任何输入。

输出:

输出具有题目要求的性质的数,如果结果有多组,那么各组数据之间以回车隔开

  • 分析复杂度:

image.png

对称平方数,这个数的平方等于平方的逆序数,满足小于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;
	}