杭电OJ判断Runtime Error (ACCESS_VIOLATION)

滚弹开花 2017-08-28 10:30:55
程序在cb上运行正常,提交到OJ上就说这个错误Runtime Error (ACCESS_VIOLATION)。希望各位帮忙指点。
这个是杭电OJ1003道题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int integer[1000];
int CaseNumber ; ///情况数
int IntegerNumber ;///每一种情况包含的数字个数
int MaxSum[1000] ;
int Max ;
int start ;
int end ;
int i , j , k , q ;

///数组初始化
memset(integer,0,1000);
memset(MaxSum,0,1000);

//printf("input the case number:");
scanf("%d",&CaseNumber);///输入例子数
for(i=1;i<=CaseNumber;i++)
{
start = 0 ;
scanf("%d",&IntegerNumber); ///输入情况内部数字个数
for(j=1;j<=IntegerNumber;j++)
{
scanf("%d",&integer[j]); ///输入数组
if( start == 0 && integer[j] >= 0 )///确定第一个大于等于零的数作为起始位
start = j ;
}

///应对全是负数情况
if (start == 0)
{
start = 1 ;
end = 1 ;
Max = integer[1] ;
}
else
{
MaxSum[start-1] = 0 ;///计算从第一项开始每往后加一个数的和的数组
for(k=start;k<=IntegerNumber;k++)
MaxSum[k] = MaxSum[k-1] + integer[k] ;

Max = MaxSum[start] ;///求出和数组中的最大值
end = start ;
for(q=start;q<=IntegerNumber;q++)
{
if(MaxSum[q+1]>Max)
{
Max = MaxSum[q+1] ;
end = q+1 ;///更新最后位置数
}
}
}
printf("Case %d:\n",i);///输出Case #:
printf("%d %d %d\n\n",Max,start,end);
}
return 0 ;
}
...全文
797 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2017-09-04
  • 打赏
  • 举报
回复
可以去搜索最大组数组的问题,http://blog.csdn.net/liufeng_king/article/details/8632430这个博客你可以看一看,大概就会懂了
kugeniha 2017-08-28
  • 打赏
  • 举报
回复
最好把题目说出 来
自信男孩 2017-08-28
  • 打赏
  • 举报
回复
or(j=1;j<=IntegerNumber;j++)
        {
            scanf("%d",&integer[j]); ///输入数组
            if( start == 0 && integer[j] >= 0 )///确定第一个大于等于零的数作为起始位
                start = j ;
        }
这个地方有可能导致越界,比如输入的IntegerNumber为1000,这个地方就越界了。下标从0开始,
or(j=0;j<IntegerNumber;j++)
        {
            scanf("%d",&integer[j]); ///输入数组
            if( start == 0 && integer[j] >= 0 )///确定第一个大于等于零的数作为起始位
                start = j ;
        }
另外,对于大数组,建议定义成全局的或者静态变量。栈上的空间是稀少和宝贵的,不建议占用栈上的过多空间。
 static int integer[1000];
    int CaseNumber ; ///情况数
    int IntegerNumber ;///每一种情况包含的数字个数
    static int MaxSum[1000] ;
赵4老师 2017-08-28
  • 打赏
  • 举报
回复
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 依据所提供的资料,我们深入剖析此问题以及所给出的两种算法方案。 ### 问题背景 该问题源自王晓东编撰的《算法设计与实验题解》一书,书中阐述了一个值得注意的数学议题:针对一本页码从1到n顺序编号的书籍,要求统计所有页码中数字0至9各自出现的频次。例如,若n=13,则页码序列为1、2、...、13,其中数字1出现5次(体现在1、10、11、12、13中),数字0出现1次(体现在10中)。 ### 问题描述 具体而言,我们需要开发一种算法,其输入参数为一个正整数n,输出结果需为0至9这十个数字各自出现的频次。所有页码均以十进制形式呈现,且不包含任何前导零,即不会出现如006之类的页码表示。 ### 解决方案一:时间复杂度为O(n*log10(n))的算法 首先,介绍一种时间复杂度为O(n*log10(n))的算法实现。其核心构思在于遍历从1到n的每一个数值,然后逐一分解每个数值的各个位,并统计各类数字出现的频次。具体步骤如下: 1. 初始化一个长度为10的数组`count`,用于记录0至9每个数字出现的频次,初始值均为0。 2. 从1开始遍历至n,对于每一个数值i,将其转换为整数并进行以下操作: - 利用循环结构,持续将当前数值除以10,获取余数(即当前最低位的数字),并累加到对应的计数器中。 3. 遍历完成后,输出`count`数组中的每一个元素,即为所求的结果。 ### 解决方案二:优化算法 为了提升效率,提出了一种更为优越的算法。该算法基于以下观察:在1到10^n-1之间的任意区间内,每一种数字0至9出现的频次是相等的。例如,在1到999之间,每一种数字0至9出现的频次均相...

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧