| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 762 人关注过本帖
标题:数组问题
只看楼主 加入收藏
莫一阳
Rank: 1
等 级:新手上路
帖 子:38
专家分:6
注 册:2011-4-27
结帖率:78.57%
收藏
已结贴  问题点数:20 回复次数:8 
数组问题
如何求一个由n个元素组成整型数组中连续m(m<=n)个元素的和的最大值???
搜索更多相关主题的帖子: 元素 如何 
2011-10-18 22:12
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:20 
程序代码:
#include<stdio.h>
#define N 10
int main()
{
    int a[N]={0};
    int s[N]={0};
    int m=0;
    int i,j,max=0,flag=0;
    for(i=0;i<N;i++)
    {
        printf("Input a[%d]:",i);
        scanf("%d",&a[i]);
    }
    printf("Input m:");
    scanf("%d",&m);
    for(i=0;i<=N-m;i++)
    {
        for(j=0;j<m;j++)
        {
            s[i]+=a[j+i];
        }
    }
    max=s[0];
    for(i=0;i<N-m;i++)
    {
        if(s[i]<s[i+1])
        {
            max=s[i+1];
            flag=i+1;
            printf("%d\n",flag);
        }
    }
    printf("从第%d个数连续加%d个数最大值为:%d\n",flag+1,m,max);
    return 0;
}
以上代码有问题!!!
修改如下:
程序代码:
#include<stdio.h>
#define N 10
int main()
{
    int a[N]={0};
    int s[N]={0};
    int m=0;
    int i,j,max=0,flag=0;
    for(i=0;i<N;i++)
    {
        printf("Input a[%d]:",i);
        scanf("%d",&a[i]);
    }
    printf("Input m:");
    scanf("%d",&m);
    for(i=0;i<=N-m;i++)
    {
        for(j=0;j<m;j++)
        {
            s[i]+=a[j+i];
        }
    }
    max=s[0];
    for(i=0;i<N-m;i++)
    {
        if(max<s[i+1])////////此处错误,已修改
        {
            max=s[i+1];
            flag=i+1;
         //    printf("%d\n",flag);
        }
    }
    printf("从第%d个数连续加%d个数最大值为:%d\n",flag+1,m,max);
    return 0;
}
求谅解。

[ 本帖最后由 laznrbfe 于 2011-10-21 10:34 编辑 ]
2011-10-18 23:34
莫一阳
Rank: 1
等 级:新手上路
帖 子:38
专家分:6
注 册:2011-4-27
收藏
得分:0 
回复 2楼 laznrbfe
高手,谢了……
2011-10-19 14:13
wukaibit
Rank: 1
等 级:新手上路
帖 子:4
专家分:7
注 册:2009-11-15
收藏
得分:0 
程序代码:
#define N 4
int main(void)
{
    int a[]= {4,6,7,1,2,3,8,};
    int Max = 0,TemM = 0 ;
    int counter ;
   
    int M = sizeof(a)/sizeof(int);
    for(counter= 0; counter<N; counter++)
        Max +=a[counter];
    TemM = Max;
    for(counter = 0; counter<M-N;counter++)
    {
          TemM +=a[N+counter] - a[counter];
        if(TemM > Max)
           Max = TemM ;
    }
    printf("Max:%d\n",Max);
}


[ 本帖最后由 wukaibit 于 2011-10-19 23:26 编辑 ]
2011-10-19 23:11
yebin1988
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-8-25
收藏
得分:0 
太坑爹了吧。
。。。。
 max=s[0];
    for(i=0;i<N-m;i++)
    {
        if(s[i]<s[i+1])
        {
            max=s[i+1];
            flag=i+1;
            printf("%d\n",flag);
        }
    }
    printf("从第%d个数连续加%d个数最大值为:%d\n",flag+1,m,max);
    return 0;
}

显然不对!
2011-10-20 22:25
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
回复 5楼 yebin1988
谢谢指出错误,我会修改的~
2011-10-21 09:58
tangconghui
Rank: 1
等 级:新手上路
帖 子:10
专家分:6
注 册:2011-10-17
收藏
得分:0 
发一个效率高一点的

#include<stdio.h>
#include<iostream.h>
#include<math.h>
using namespace std;

int main()
{
    int *list_a;
    float *list_b;
    float max;
    int m,n,k,i;
    printf("请输入n的值");
    scanf("%d",&n);
    list_a=(int*)malloc(n*sizeof(int));
    printf("请依次输入各元素");
    for (k=n;k>0;k--)
    {
        scanf("%d",&list_a[n-k]);   
    }
    printf("请输入m的值");
    scanf("%d",&m);
    list_b=(float*)malloc( ( (n-m+1)/2 ) *sizeof(float));
    for (k=0;k+m<n;k=k+2)
    {
        //printf("死循环");
        if (list_a[k]>list_a[k+m])
        {
           for (i=0;i<m;i++)
           {
               list_b[k/2]=list_b[k/2]+list_a[i+k];   
           }
        }
        else
        {
             for (i=0;i<m;i++)
           {
               list_b[(k/2)]=list_b[(k/2)]+list_a[i+k+1];   
           }   
        }
    }
   
    if (k+m==n)
    {
       for (i=0;i<m;i++)
           {
               list_b[k]=list_b[k]+list_a[i+k];   
           }           
    }
    for (i=0;i<( (n-m+1) /2);i++)
    {
        printf("%f ",list_b[i]);
    }
    max=list_b[0];
    for (i=1;i<((n-m+1)/2);i++)
    {
        if (max<list_b[i])
        {
           max=list_b[i];                  
        }
    }
   
    printf("\n%f",max);  
    system("pause");
    return 1;
}
2011-10-21 10:52
笨到家啦
Rank: 2
等 级:论坛游民
帖 子:19
专家分:73
注 册:2010-6-7
收藏
得分:0 
本人也提一点小小是建议:
在看到以上的程序中,好象都是从某个数中求出连续的M个数的和,然后再比较他们的大小。我认为这样算法有些重复,如果我们改成先求前M个数的和放到一个变量MAX中,然后通过加上第M+1个数减去第一个数得到第二个和值与MAX比较,并把大的值再放到MAX中,再后就是加第M+2个数,减去第2个数得到第三个和值。。。如此重复N-M次就能完成运算。这样的算法应该更加精练,不知是否正确,请指教。至于程序本人就不拿出来献丑了。




2011-10-21 21:29
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
程序代码:
#include<stdio.h>
int main()
{
    int i,j,k;
    int b,c,n;
    while(EOF != scanf("%d",&n))
    {
        if(0 == n)
            break;
        int a[10001] = {0};
        int max[10001] = {0};
        int begin = 0,end = 0,tempmax = -1;
        int tempbegin = 0;
        for(i = 1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if(1 == i)
            {
                max[i] = a[i];
                tempmax = max[i];
                tempbegin = begin = end = i;
            }
            else
            {
                if(max[i-1]>=0)
                {
                    max[i] = max[i-1]+a[i];
                }
                else
                {
                    max[i] = a[i];
                    tempbegin = i;
                }
                if(tempmax < max[i])
                {
                    tempmax = max[i];
                    end = i;
                    begin = tempbegin;
                }
            }
        }
        for(i = 1;i<=n;i++)
            if(a[i]>=0)
                break;
        if(i > n)
            printf("0 %d %d\n",a[1],a[n]);
        else
            printf("%d %d %d\n",tempmax,a[begin],a[end]);
    }
    return 0;
}
TOJ原题  比楼主的那个复杂点  网址http://acm.tzc.

                                         
===========深入<----------------->浅出============
2011-10-21 21:37
快速回复:数组问题
数据加载中...
 
   



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

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