目录
一、布隆过滤器
用来判断某个元素是否在集合内,具有运行快,内存占用小的特点。
它只能得出两个结论:在集合中或者可能在集合内。
例如:下面的例子我们把Frandy和Eli分别通过HASH函数映射到集合内,对应位置填上1。现在我们需要查询Tom,我们的做法就是将Tom使用HASH函数,看是否映射在了集合位为1的位置,如果没有,得出Tom不在集合中;我们查询Lily,通过HASH函数,我们发现有个别位置为1,所以我们可以得出,它可能在集合中。
文档说明:5 分钟搞懂布隆过滤器,亿级数据过滤算法你值得拥有! - 知乎 (zhihu.com)
二、随机函数
定义一个包含10个整型元素的数组,数组的值为随机值。
int main()
{
const int n = 10;
int ar[n];
for (int i = 0; i < n; i++)
{
ar[i] = rand() % 100;
}
for (int i = 0; i < n; i++)
{
printf("%5d", ar[i]);
}
}
此时的输出结果每次运行都是如下:伪随机
Q:如何使得随机值每一次都随机呢?
A:改变随机因子scrand。
令scrand(2);
令srand(1);
我们发现,改变了随即因子,随机值每次都会发生改变,但是为了避免每次都手动更改,所以我们使用time。time代表的就是从1970到现在的秒数 。因为每一秒都不一样,使用它作为随机因子,可以自动改变每一次执行的随机结果。
三、作业
1.设计一个计算器程序
要求:使用多文件结构,实现加、减、乘、除运算。
分析:读入两个操作数和运算符,根据运算符完成相应运算。
Counter.h
#include <stdio.h>
#ifndef COUNTER_H
#define COUNTER_H
//函数的声明
extern int Add_Int(int a,int b);
extern int Sub_Int(int a, int b);
extern int Mul_Int(int a, int b);
extern int Div_Int(int a, int b);
void Show_Sum(int a,int b,char op,int sum);
void Counter(int a,int b,char op);
#endif // !COUNTER.H
Counter.cpp
#include <stdio.h>
#include "Counter.h"
int Add_Int(int a, int b)
{
int sum = 0;
sum = a + b;
return sum;
}
int Sub_Int(int a, int b)
{
int sum = 0;
sum = a - b;
return sum;
}
int Mul_Int(int a, int b)
{
int sum = 0;
sum = a * b;
return sum;
}
int Div_Int(int a, int b)
{
int sum = 0;
sum = a / b;
return sum;
}
void Show_Sum(int a, int b, char op, int sum)
{
printf("%d %c %d = %d", a, op, b, sum);
}
void Counter(int a, int b, char op)
{
int sum;
bool flag = true;
switch (op)
{
case '+':
sum = Add_Int(a, b);
break;
case '-':
sum = Sub_Int(a, b);
break;
case '*':
sum = Mul_Int(a, b);
break;
case '/':
if (b != 0)
{
sum = Div_Int(a, b);
}
else
{
printf("除数不能为0");
}
break;
default:
printf("运算符错误!");
flag = false;
break;
}
if (flag)
{
Show_Sum(a, b, op, sum);
}
}
test_cpp(主函数)
#include<stdio.h>
#include"Counter.h"
int main()
{
int a;
int b;
char op;
scanf("%d %c %d", &a,&op,&b);
Counter(a, b, op);
}
2.输入年月日,输出这是这一年第几天
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
bool Is_Leap(int year)
{
return(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int GetDateToDay(int year,int month,int days)
{
int day[] = { 29,31,28,31,30,31,30,31,31,30,31,30,31 };
if (Is_Leap(year) && (month == 2))
{
month = 0;
}
for (int i = 0; i < month- 1; i++)
{
days =days + day[i];
}
return days;
}
int main()
{
int year;
int month;
int days;
scanf("%d %d %d", &year, &month, &days);
if (year < 1)
{
return -1;
}
if (month < 1 || month>12)
{
return -2;
}
if (!Is_Leap(year)&&(month==2))
{
if (days < 1 || days>28)
{
return -3;
}
}
if (Is_Leap(year) && (month == 2))
{
if (days < 1 || days>29)
{
return -4;
}
}
days = GetDateToDay(year, month, days);
printf("这是%d年第%d天",year,days);
return 0;
}
3.输入年月日,输出这是几几年几几月的星期几
查数学家的公式~
蔡勒公式:星期几=(日期+2*月份+3*(月份+1)/5+年份+年份/4-年份/100+年份/400)/7。
result=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+days)%7
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
bool Is_Leap(int year)
{
return(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int GetDateToDay(int year, int month, int days)
{
int day[] = { 29,31,28,31,30,31,30,31,31,30,31,30,31 };
if (Is_Leap(year) && (month == 2))
{
month = 0;
}
for (int i = 0; i < month - 1; i++)
{
days = days + day[i];
}
return days;
}
int main()
{
int year;
int month;
int day;
int days;
int result;
scanf("%d %d %d", &year, &month, &day);
if (year < 1)
{
return -1;
}
if (month < 1 || month>12)
{
return -2;
}
if (!Is_Leap(year) && (month == 2))
{
if (day < 1 || day>28)
{
return -3;
}
}
if (Is_Leap(year) && (month == 2))
{
if (day < 1 || day>29)
{
return -4;
}
}
days = GetDateToDay(year, month, day);
result = (year - 1 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + days) % 7;
printf("这是%d年%d月%d日星期%d", year,month,day,result);
return 0;
}
4.冒泡排序
定义大小为100的整型数组,使用随机函数给数组元素赋值,数值范围为1…100,并且排序,使用冒泡排序实现。
冒泡排序详解:排序算法之冒泡排序(图解)_Sueko的博客-CSDN博客
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void bubbleSort(int array[], int size)
{
//第一个for循环代表遍历多少遍
for (int i = 0; i < size - 1; i++)
{
//第二个for循环代表每次遍历多少个元素
for (int j = 0; j < size - i - 1; j++)
{
if (array[j + 1] > array[j])
{
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
void showArray(int array[],int size)
{
for (int i = 0; i < size; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
int main()
{
const int size = 100;
int arr[size];
srand(time(NULL));
for (int i = 0; i < size; i++)
{
arr[i] = rand() % 100 + 1;
}
bubbleSort(arr, size);
printf("Sorted Array in Ascending Order:\n");
showArray(arr, size);
}
5.不允许重复的随机值
定义大小为100的整型数组,使用随机函数给数组元素赋值,数值范围是1…100,且不容许重复。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void showArray(int array[], int size)
{
for (int i = 0; i < size; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
int main()
{
const int size = 100;
int arr[size];
int count = 0;
int isNotInclude = 1;
srand(time(NULL));
while (count<size)
{
int num = rand() % 100 + 1;
for (int i = 0; i < count; i++)
{
if (num == arr[count])
{
isNotInclude = 0;
break;
}
}
if (isNotInclude)
{
arr[count] = num;
count++;
}
}
showArray(arr, size);
}