| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 763 人关注过本帖
标题:关于上一次的病毒扫描问题,再次开贴请教.
只看楼主 加入收藏
tianqiao
Rank: 2
等 级:论坛游民
帖 子:80
专家分:55
注 册:2011-9-21
结帖率:85.71%
收藏
已结贴  问题点数:20 回复次数:9 
关于上一次的病毒扫描问题,再次开贴请教.
上一次发了一个病毒扫描问题.这一次把我的和同学程序一并发上来,求教有什么不同???
搜索更多相关主题的帖子: 病毒 
2011-12-25 14:39
tianqiao
Rank: 2
等 级:论坛游民
帖 子:80
专家分:55
注 册:2011-9-21
收藏
得分:0 
这是同学的:
程序代码:
#include<stdio.h>
#include<string.h>
int main()
{
    int n,m,i,j,q,k;
    char a[1000][100],b[100],c[1000][100];
    char d[100];
    for(;;)
    {
        scanf("%d\n",&n);
        if(n==0)break;
        q=0;
        for(i=0;i<n;i++)
            gets(a[i]);
        for(i=0;i<n;i++)
        {
            m=strlen(a[i]);
            if(m>4&&a[i][m-1]=='e'&&a[i][m-2]=='x'&&a[i][m-3]=='e'&&a[i][m-4]=='.')
            {
                for(j=0;j<m-4;j++)
                    b[j]=a[i][j];
                b[j]='\0';
                for(j=0;j<n;j++)
                {
                    if(strcmp(b,a[j])==0)
                    {
                        strcpy(c[q],a[i]);
                        q++;
                    }
                }
            }
            else continue;
        }
        if(q==1)
            puts(c[0]);
        else
        {
            for(i=0;i<q;i++)
            {
                strcpy(b,"zzzzzzzzzzzzzzzzzzzzzzzzzzz");
                for(j=i;j<q;j++)
                {
                    if(strcmp(c[j],b)<0)
                    {
                        strcpy(b,c[j]);
                        k=j;
                    }
                }
                strcpy(d,c[i]);
                strcpy(c[i],b);
                strcpy(c[k],d);
            }
            for(i=0;i<q;i++)
                puts(c[i]);
        }
    }
    return 0;
}

2011-12-25 14:40
tianqiao
Rank: 2
等 级:论坛游民
帖 子:80
专家分:55
注 册:2011-9-21
收藏
得分:0 
这是我的:
程序代码:
#include<stdio.h>
#include<string.h>
int main()
{
    int sum,num,i,j,flag=0,mark=0;
    char ss[1001][20],s1[1001][20],s2[1001][20],s3[1001][20],tmp[20];
    while(scanf("%d",&sum)&&sum){
        if(sum==0)break;
        scanf("\n");
        for(i=0;i<sum;i++){
            gets(ss[i]);
        }                                   //输入
        for(i=0;i<sum;i++)
            for(j=0;;j++){
                if(ss[i][j]=='\0'||ss[i][j]=='\n')break;
                if(ss[i][j]=='.'&&ss[i][j+1]=='e'&&ss[i][j+4]=='\0')
                {
                    strcpy(s1[flag],ss[i]);
                    flag++;
                    break;
                }
            }                                    //末尾是.exe的保存                                      

        for(i=0;i<flag;i++)
            for(j=0;;j++){
                s2[i][j]=s1[i][j];
                if(s1[i][j+1]=='.'&&s1[i][j+2]=='e'&&s1[i][j+5]=='\0'){
                s2[i][j+1]='\0';
                break;
                }
            }                                     //把.exe割掉                                    

        for(i=0;i<flag;i++)
            for(j=0;j<sum;j++){
                if(strcmp(s2[i],ss[j])==0)
                {   strcpy(s3[mark],s1[i]);
                    mark+=1;
                    break;
                }
            }                                       //判断是否有和去除.exe相同的文件  有的话就填上.exe                       

                for(i=0;i<mark-1;i++)
                    for(j=0;j<mark-1-i;j++)
                    {
                        if(strcmp(s3[j],s3[j+1])>0)
                        {
                            strcpy(tmp,s3[j]);
                            strcpy(s3[j],s3[j+1]);
                            strcpy(s3[j+1],tmp);
                        }
                    }                                      //排序                     

                    for(i=0;i<mark;i++){
                        puts(s3[i]);
                    }
                        flag=0;mark=0;
    }
    return 0;
}
运行的时候结果一样,可是前一个AC后一个WA纠结......
2011-12-25 14:41
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:5 
浙江工商大的  学校很好嘛  建议你不要看你的同学的了 直接去看杨大哥的代码

他是的时间复杂度是n

                                         
===========深入<----------------->浅出============
2011-12-25 16:26
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:15 
呵呵,更正一下,我的代码时间复杂度是n*log(n)。主要的时间消耗在了排序上。
对于.exe结尾的字符串不能都简单地删除.exe了之。这也是我之前犯的错误。病毒也可能复制一个.exe文件并在结尾再加一个.exe。
所以如果对原.exe文件删除了后缀就可能漏过这样的病毒。
我的算法基于这样一个设定,就是一组测试数据中没有两个文件是同名的(这是一个符合实际的假设)。
所以我在读取文件名后存储该文件名,之后判断它的后缀是不是.exe。如果是则将删除后缀后的文件名也存入缓存(那个数组)。
全部读取完后对所有的缓存排序。如果存在病毒,则必然会在排序后的缓存里形成两个相邻的且相同的文件名,并由此输出病毒文件名。

重剑无锋,大巧不工
2011-12-25 17:25
心灵百合
Rank: 5Rank: 5
等 级:职业侠客
帖 子:215
专家分:367
注 册:2011-3-30
收藏
得分:0 
有意思额……
2011-12-25 17:36
tianqiao
Rank: 2
等 级:论坛游民
帖 子:80
专家分:55
注 册:2011-9-21
收藏
得分:0 
回复 5楼 beyondyf
楼上的代码我看过了,虽然二重指针有点难懂,可是还是看懂了.现在我看不出我的代码有什么错误.求指教.
2011-12-25 19:08
tianqiao
Rank: 2
等 级:论坛游民
帖 子:80
专家分:55
注 册:2011-9-21
收藏
得分:0 
我想了一下,前面AC的代码和楼上AC代码的共性是排序不同.......我的是冒泡排序,楼上的是快速排序,我同学的排序是....(我也不知名字),可这三种排序并没有区别..纠结之......
2011-12-25 19:38
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
这个问题和用什么排序算法没什么关系。
刚刚仔细地看了一下你的代码,我对你判断后缀的方式有点质疑。
你只判断了.exx,就确信是.exe了么?测试样例中会不会包含.eab这样的后缀呢?
不妨试试。

重剑无锋,大巧不工
2011-12-25 23:50
tianqiao
Rank: 2
等 级:论坛游民
帖 子:80
专家分:55
注 册:2011-9-21
收藏
得分:0 
昨天改了一下居然还是WA
2011-12-26 09:06
快速回复:关于上一次的病毒扫描问题,再次开贴请教.
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024373 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved