穷举法
该方法由两部分组成:
- 一是系统化地枚举问题各种可能的候选解;
- 二是检查验证每一个候选解是否满足问题的求解要求。
实现穷举法的4个步骤:
- 首选(first)。c=first (I):产生问题实例I的第一个候选解c(candidate solution);
- 验证(valid)。valid (l, c):检查验证(validate)候选解c是否为问题实例I的解;
- 输出(output)。output (1, e):如果c为I的解则将其输出;
- 再选(next)。next (1, c):从当前候选解c顺次产生下一个候选解。
作业
(1) 素性测试算法
#include<stdio.h>
#include<windows.h>
#include<math.h>
#define N 5//测试数据个数
//判断素数
void Primality(int num) {
int i = 2;//i起始从2开始
boolean flag = true;//初始认定num为素数
while (i <= sqrt(num)) {//i小于num开方
if (num % i == 0) {//若num对i取余为0,则num不为素数
flag = false;
break;//跳出循环
}
i++;
}
if (flag)
printf("%d 是素数\n", num);
else
printf("%d 不是素数!\n", num);
printf("\n"); printf("\n");
}
//测试
void TestPrimality(int* arr,int len) {
for (int i = 0; i < len; i++) {
Primality(arr[i]);
}
printf("\n");
}
int main() {
//测试数据
int arr[N] = { 200, 1013, 2000, 10303, 100000 };
TestPrimality(arr, N);
}
(2) 伪随机函数
(a)设置种子为1,输出5~10个数;
#include<stdio.h>
#include<windows.h>
#include <time.h>
#include<math.h>
void RandTest_01(int len) {
srand(1); // 设置种子的值为1,如果不设置,默认种子为1
for (int i = 0; i < len; ++i) {
printf("%d\n",rand()); // 输出10个伪随机数
}
}
int main() {
int len = 10;
RandTest_01(len);
}
(b)设置一个不是1的种子,输出5~10个数;
#include<stdio.h>
#include<windows.h>
#include <time.h>
#include<math.h>
void RandTest_02(int len) {
srand(100); // 设置种子的值为2
for (int i = 0; i < len; ++i) {
printf("%d\n", rand()); // 输出10个伪随机数
}
}
int main() {
int len = 10;
RandTest_02(len);
}
(c)设置随时间变化的种子,输出5~10个数。
#include<stdio.h>
#include<windows.h>
#include <time.h>
#include<math.h>
void RandTest_03(int len) {
time_t t = time(nullptr);
srand(t); // 设置种子的值为时间
for (int i = 0; i < len; ++i) {
printf("%d\n", rand()); // 输出10个伪随机数
}
}
int main() {
int len = 10;
RandTest_03(len);
}