/*1。定义自体二进制集合S(有很多个7位二进制1100110 ,类似这样的数)
2。随机生成一个候选集合二进制的(生成7位1100110,类似这样的二进制)
3。把自体集合,跟随机生成的集合的字符串,相比较。例如:7位二进制。如果有连续四位相同的话,则属于匹配的。
4。将匹配的删除。。。不匹配的保留。
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX 30
#define N 3
#define MAX1 1
int cmp(char *p, char *q){ //有连续四位相同的话,则属于匹配
int i, j;
int flag = 0;
for (j = 0; j < N; j++)
{
for (i = 0; i < 7; i++)
{
if (flag >= 4)
return 1;
else if (flag + 7 - i < 4)
return 0;
else
{
if (p[i] == q[i])
flag++;
else
flag = 0;
}
}
}
}
void del(char c[][8], int &length, int i , int &num) //删除
{
for ( ; i < length-1; i++)
strcpy(c[i], c[i+1]);
num++;
length--;
}
void find_virus(char c[][8], int &length){
int i, j, k = 0;
int h = 0, flag;
char p[MAX1][8], q[MAX1][8];
printf("input data:/n");
for (i = 0; i < MAX1; i++)
scanf("%s", p[i]);
printf("/nsafe file:/n");
for (j = 0; j < length; j++)
{
flag = 0;
for (i = 0; i < MAX1; i++)
{
if (strcmp(p[i], c[j]) == 0)
{
strcpy(q[k++], p[i]);
flag = 1;
break;
}
}
if (flag == 0)
puts(c[j]);
}
printf("/nvirus:/n");
for (i = 0; i < k; i++)
puts(q[i]);
}
int main(){
char s[N][8] = {"1100110", "1111111", "0000000"}; //定义自体二进制集合S
char a[MAX][8];
char string[2] = {'1', '0'};
int t;
int i, j, r, len;
int num;
printf("随便输入一个整数:"); //输入一个数作为产生随机数的种子,
//输入的数字不同,产生的随机数有可能不同
scanf("%d", &t);
srand(t);
printf("生成的数据 %d组:/n", MAX);
for (i = 0; i < MAX; i++)
{
for (j = 0; j < 7; j++)
{
a[i][j] = string[rand()%2]; //随机生成一个候选集合二进制
}
a[i][j] = '/0';
puts(a[i]);
}
printf("/n/n");
len = i;
num = 0;
for (j = 0; j < i; j++)
{
for (r = 0; r < N; r++)
{
if (cmp(a[j], s[r]) == 1)
{
puts(a[i]);
del(a, len, j, num);
}
}
}
printf("以上为匹配的数据,共有%d组/n/n", num);
for (i = 0; i < len; i++)
puts(a[i]);
printf("不匹配的共有%d组/n/n", MAX - num);
for (j = 0; j < N ; j++, len++)
strcpy(a[len], s[j]);
printf("库中的数据:/n");
for (i = 0; i < len; i++)
puts(a[i]);
find_virus( a, len);
return 0;
}