| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 410 人关注过本帖
标题:有哪位高手帮我分析一下这个c语言程序 尽量详细
取消只看楼主 加入收藏
bball27
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-3-29
结帖率:0
收藏
已结贴  问题点数:20 回复次数:0 
有哪位高手帮我分析一下这个c语言程序 尽量详细

#include<stdio.h>
#include<io.h>
#include<string.h>
#include<stdlib.h>
#define L 5
#define H 20000
int hh;
int hjqs,hjqt;
int dsh;//倒数第几个数

void showa(int m,int n, int sz[][L])
{
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%d ",sz[i][j]);
            
        }
        printf("\n");
    }
}

void ftoi(char *lj,int sj[][L])
{
    FILE *fp;
    char tp[100],*p;
    int i,n;
    fp=fopen(lj,"r+");
    for(n=0;feof(fp)==0;n++)
    {
        tp[0]=0;
        fgets(tp,100,fp);
        if(strlen(tp)<2)break;
        p=&tp[strlen(tp)];
            for(i=1;(*p)!='\t';p--)
            {
                if((*p)>='0'&&(*p)<='9')
                {
                    sj[n][L-i]=(*p)-'0';
                    i++;
                }
            }
    }
    fclose(fp);
    hh=n;
}
 

int chuxian(int a,int n,int *s)//s数组中最后n个数中是否出现a
{
    int i;
    for(i=L-n;i<L;i++)
    {
        if(s[i]==a)return 1;
    }
    return 0;
}

int fun1(int a,int sj[][L])//在每行的最后 3 个数中最多有连续几行没有出现a
{
    int n,nn;
    int i,j;
    n=nn=0;
    for(i=0;i<hh;i++)
    {
        if(chuxian(a,3,sj[i])==0)nn++;
        else
        {
            if(nn>n)n=nn;
            nn=0;
        }
    }
    return n>nn?n:nn;
}

struct tt
    {
        int a[10];
        int an;
    };
   

int mfun2(int sj[][L],int n,int *ii)//从第ii行开始往上统计每行最后一个数共出现n个时再上面一行的所有数是否都是已出现过的那n个数;
                                    //成立返回1,不成立返回0,已到达数据顶部,无法再判断返回-1;并返回判断后停留的行号;
{
    int i,j;
    struct tt hjq={0,1,2,3,4,5,6,7,8,9,0};
   
    for(i=(*ii);1;i--)
    {   if(i<0)
        {
            //printf("-1 %d→%d\n",i,*ii);
            return -1;
        }
        else if(hjq.an==n)break;

        if(hjq.a[sj[i][L-dsh]]!=-1)
        {
            hjq.a[sj[i][L-dsh]]=-1;
            hjq.an++;
        }
    }

    //for(j=0;j<L;j++)
    //{
        if(hjq.a[sj[i][L-dsh]]!=-1)//检查该行倒数第dsh个数
        {
            //printf("0 %d→%d\n",i,*ii);
            *ii=i;
            return 0;
        }
    //}
    //printf("1 %d→%d\n",*ii,i);
    *ii=i;
    return 1;
}


int fun2(int sj[][L],int n)//统计 从最后一行起,每行最后一个数有不同的n个时,再上面一行所有数都是已出现过的数 的情况连续出现最多的次数
{
    int i,m;
    int x,x0;
    int tj=0;
    int hjqts,hjqtt,ii[2];
    int *cp,nn;
    x=x0=0;
    cp=(int*)calloc(hh,sizeof(int));
    for(i=hh-1;(m=mfun2(sj,n,&i))!=-1;ii[0]=i-1,ii[1]=m,i--)
    {

        if(m)
        {
            if(x0==0&&ii[1]==0)
            {
                hjqts=ii[0];
            }
            hjqtt=i;
            x0++;
            tj++;
        }
        else
        {
            (*(cp+x0-1))++;
            if(x0>x)
            {
                hjqt=hjqtt;
                hjqs=hjqts;
                x=x0;
            }
            x0=0;
        }
    }
    if(m==1)  (*(cp+x0-1))++;
    for(nn=(x>x0?x:x0);
        nn>=1;nn--){
        printf("连续%d次不中共有%d次\n",nn,*(cp+nn-1));
    }
    //free(cp);
    //printf("满足条件的有%d条。\n",tj);
    return (x>x0?x:(hjqt=hjqtt,hjqs=hjqts,x0));
}

int fun3(int sj[][L],int n,int m)//9个数字中有不同的n个数字,每行读取倒数m个数组成方阵
{
    int i,j,q,kj,kj0;
    int ii[2]={0,0},sum,sum0;
    int hjqss,hjqtt;
    sum=sum0=0;
    //for(q=hh-1;q>0;q-=m+1)
    for(i=hh-1;i>0;)
    {

        struct tt hjq={0,1,2,3,4,5,6,7,8,9,0};
        kj=1;
        if(ii[0]==0)
        {
            if(ii[1]==1)
                {

                    if(sum<sum0){
                        sum=sum0;
                        hjqs=hjqss;
                        hjqt=hjqtt+1;
                    }
                    sum0=0;
                }
        }
        else
        {
            if(ii[1]==0)hjqss=i;
            hjqtt=i;
            sum0++;
        }
        ii[1]=ii[0];
        kj0=1;
        for(;i>0;i--)
        {
            for(j=L-1;j>=L-m;j--)
            {
                if(hjq.an==n){kj0=0;break;}
                if(hjq.a[sj[i][j]]!=-1){
                   hjq.a[sj[i][j]]=-1;
                   hjq.an++;
                }
            }
            if(kj0==0)break;
        }
        
        if(hjq.an<n){ii[0]=0;break;}
        if(hjq.an>n)
        {
            ii[0]=0;
            continue;
        }
        for(j=L-1;j>=L-m;j--)
        {
            if(hjq.a[sj[i][j]]!=-1)
            {
                ii[0]=0;
                kj=0;
                break;
            }
            
        }
        if(kj==1)ii[0]=1;
    }
   
    return (sum>sum0?sum:sum0);
   
}


int main(){
    int sj[H][L];
    int i,n;
    char lj[]="hjq.txt";
    if(access(lj,1)!=0)
    {
        puts("数据文件不存在!\n请将数据放到本程序同一目录下的hjq.txt文件中。\n\n");
        //system("pause");
        return 0;
    }
    ftoi(lj,sj);
    //printf("%d %d %d %d %d\n",sj[hh-1][0],sj[hh-1][1],sj[hh-1][2],sj[hh-1][3],sj[hh-1][4]);
    //showa(hh,L,sj);
    puts("");/*
    for(i=0;i<=9;i++)
        printf("%d 最多连续%d行没有出现。\n",i,fun1(i,sj));
    printf("\n\n");
    dsh=4;
    printf("最多连续不中次数为%d次。\n",fun2(sj,5));
    printf("所在行分别为 %d→%d \n\n",hjqs,hjqt);
    */
    printf("%d\n",fun3(sj,5,3));
    printf("所在行分别为 %d→%d \n\n",hjqs,hjqt);
    system("pause");
    return 0;
}

[ 本帖最后由 bball27 于 2010-3-29 16:42 编辑 ]
搜索更多相关主题的帖子: c语言 
2010-03-29 16:40
快速回复:有哪位高手帮我分析一下这个c语言程序 尽量详细
数据加载中...
 
   



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

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