| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3738 人关注过本帖
标题:急等! 等值数列段 不会编 好难哦!
只看楼主 加入收藏
20072815
Rank: 1
等 级:新手上路
帖 子:87
专家分:0
注 册:2007-12-1
收藏
 问题点数:0 回复次数:5 
急等! 等值数列段 不会编 好难哦!
如果一个数列中的某一段(至少有两个元素)的各元素值均相同,则称之为等值数列段。等值数列段中元素的个数叫做等值数列段的长度。[bold]输入:
[/bold]        由N个元素组成的整数数列A(其中N<=50)
[bold]输出:
[/bold]        A中长度最大的所有等值数列段的始末位置,如果没有等值数列段,则输出No equal number list.
[bold]说明:
[/bold]        始末位置是指数组下标,即0表示第一个元素。
        如果有多个同等长度的等值数列,只输出第一个等值数列的起始位置。
        当在一个LIST中出现两个等长的连续串的时候,我们的答案应该是第一个等长串。

[[italic] 本帖最后由 20072815 于 2007-12-1 11:28 编辑 [/italic]]
搜索更多相关主题的帖子: 位置 等值 元素 长度 Nlt 
2007-12-01 11:26
zbqf109
Rank: 1
等 级:新手上路
帖 子:289
专家分:0
注 册:2006-12-31
收藏
得分:0 
做了一个简单的东西,随便写了几行,基本完成了所需的功能。比较简陋,很多地方可以改进。
我就不做那么多了。

程序代码:
 
/*
如果一个数列中的某一段(至少有两个元素)的各元素值均相同,则称之为等值数列段。
等值数列段中元素的个数叫做等值数列段的长度。输入:
        由N个元素组成的整数数列A(其中N<=50)
输出:
        A中长度最大的所有等值数列段的始末位置,如果没有等值数列段,则输出No equal number list.
说明:
        始末位置是指数组下标,即0表示第一个元素。
        如果有多个同等长度的等值数列,只输出第一个等值数列的起始位置。
        当在一个LIST中出现两个等长的连续串的时候,我们的答案应该是第一个等长串。
*/
#include <stdio.h>
#include <stdlib.h>
#define MAX_ARRAY  50
#define NULL_VALUE -9999
typedef struct {
        int nValue;
        int nStart, nEnd;
}RESULTSTRUCT, *lpRESULTSTRUCT;
// print RESULTSTRUCT method
inline bool  PrintResultStruct( const lpRESULTSTRUCT );
int main()
{
    int iArray[ MAX_ARRAY ] = { 0 };
    unsigned int i = 0, j = 0;
    // maybe there is more than one point from which there are maximum  same number
    int nPos = 0;
    // when user do not want to continue input, he puts nValue to be -9999
    int nValue = 0;
    
    printf("输入一组元素(总个数不超过 %d 个, %d 结束输入):\n", MAX_ARRAY, NULL_VALUE);
    for ( ; i < MAX_ARRAY; i++ )
    {
        scanf("%d", &nValue); 
        if ( nValue == NULL_VALUE)
           break;
        iArray[i] = nValue;
    }
    iArray[i] = '\0';
    
    // result array
    RESULTSTRUCT rslt[MAX_ARRAY / 2];
    rslt[0].nStart = 0;
    rslt[0].nEnd = 0;
    rslt[0].nValue = iArray[0];
    // tempory struct to record the current infomation of the same values
    RESULTSTRUCT tmp = { iArray[0], 0, 0 };
    
    j = 1;
    while ( j <= i  )
    {
          if ( iArray[j] != tmp.nValue )
          {
               tmp.nEnd = j - 1;
               // the current number of same numbers is larger than what has or have
               //   recorded in 'rslt' array.
               if ( tmp.nEnd - tmp.nStart > rslt[0].nEnd - rslt[0].nStart )
               {
                    rslt[0].nStart = tmp.nStart;
                    rslt[0].nEnd = tmp.nEnd;
                    rslt[0].nValue = tmp.nValue;
                    nPos = 0;
               }
               // or if the current number of same numbers is equal to what has or have
               //   recorded in 'rslt' array, we just add it to the array
               else if ( tmp.nEnd - tmp.nStart == rslt[0].nEnd - rslt[0].nStart )
               {
                    nPos ++;
                    rslt[nPos].nStart = tmp.nStart;
                    rslt[nPos].nEnd = tmp.nEnd;
                    rslt[nPos].nValue = tmp.nValue;
               }
               else{
                    // do nothing
               }
               // renew the tmp RESULTSTRUCT to get ready for the next
               tmp.nStart = j;
               tmp.nEnd = j;
               tmp.nValue = iArray[j];
          }
          j++;
    }
    // printf("nPos = %d\ni = %d\n\n", nPos, i);
    
    for ( j = 0; j <= nPos; j++ )
        if ( !PrintResultStruct( &rslt[j] ) )
           break;
    
    system("pause");
    return 0;
}
inline bool PrintResultStruct( const lpRESULTSTRUCT lpRS )
{
     if ( lpRS->nStart - lpRS->nEnd == 0 )
     {
          printf( "No equal number list.\n" );
          return false;
     }
     else {
          // print the infomation of the structure and the length
          printf("nStart: %d\nnEnd: %d\nnValue: %d\nTotelLength: %d\n\n",
                     lpRS->nStart, lpRS->nEnd, lpRS->nValue, 
                     lpRS->nEnd - lpRS->nStart + 1);
          return true;
     }
}


 

2007-12-01 20:56
VanGogh
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2006-5-27
收藏
得分:0 
出去逛个超市就有高手已经写好了...看了惭愧..好像C++的
觉得要求不太明确..是只输出长度最长的串吗? 原话中"输出所有长度最长的串",最长的当然只有一个咯 我的简陋的没话说了 只能找出长度最长的串 输出 起始 结束 位置 长度

#include"stdio.h"
#define N 10 /*定义数组长度*/
main()
{int a[N]={0,1,1,1,2,3,3,3,3,6};/*初始化数组*/
find(a);
getch();
}
find(int a[])
{int *p,i,s,st=0,e,et=0,c=0,l=0;
p=a;
for(i=0;i<N-1;i++)
if(*p==*(p+1))
{if(st==0) st=i;
  c=1;p++;}
else if (c==1)
{et=i;
  if ((et-st)>l)
  {l=et-st;
   s=st;
   e=et;
   st=0;
  }
  c=0;
  p++;
}
else p++;
if(l==0) printf("No equal number list");
else printf("Start:%d End:%d Length:%d",s,e,l+1);
}


输出结果为:Start:5 End:8: Length:4

[[italic] 本帖最后由 VanGogh 于 2007-12-1 21:31 编辑 [/italic]]
2007-12-01 21:29
妍清舞
Rank: 1
等 级:新手上路
帖 子:121
专家分:0
注 册:2007-11-12
收藏
得分:0 
回复 3# 的帖子
疑问?
我把int a[N]={0,1,1,1,2,3,3,3,3,6};改为int a[N]={1,1,1,1,2,3,3,3,3,6};得到的结果也为Start:5 End:8: Length:4,请问怎样才能把两种情况都表示出来呢?即使结果为Start:0 End:3: Length:4和Start:5 End:8: Length:4,我是初学者所以请别见怪。
2007-12-08 22:49
xianshizhe111
Rank: 1
等 级:新手上路
帖 子:1451
专家分:0
注 册:2007-12-8
收藏
得分:0 
回复4#你可以用键盘连续输入.
/*c 语言实现等值数据段*/
#include<stdio.h>
#include<conio.h>

void main()
{
  int i=0,j,k=0;
  int temp,tel;
  int a[50],b[50];
  int MAX_ARRAY;
  int start[200],end[200],length[200];

  clrscr();

  printf("Please input some numbers:\n");
  printf("PUT :");
  while((a[i]=getchar())!='\n')
     {
       /*a[i]=getchar();*/
       b[i]=a[i];
       i++;
     }
     MAX_ARRAY=i;
    for(i=0;i<MAX_ARRAY;i++)
      { temp=a[i];
          

       for(j=i+1;j<MAX_ARRAY;j++)

      { if(temp==a[j])

           {
             start[k]=i;
             end[k]=j;
             length[k]=(end[k]-start[k]+1);
             k++;
           }

       }

    }
    if(k==0)
      printf("NOT DATA:\n");
    else  
     { printf("OUT  :");
       tel=0;
       for(i=0;i<k;i++)
         if(tel<length[i])
          tel=length[i];
         else
          break;
       printf("start=%d,end=%d,length=%d\n",start[i-1],end[i-1],length[i-1]);
     }  

}
2007-12-12 17:35
快速回复:急等! 等值数列段 不会编 好难哦!
数据加载中...
 
   



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

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