求int型数组和最大子数组 续

之前的博文里已经实现过该程序的构思、编译、运行,本次就不再重复与之相雷同的内容。

题目:与别人借组,借助求int型数组最大和子数组的问题,考虑大数溢出和int取值范围的问题

要求:

调试程序  当子数组所含元素值超过int型数组取值范围时,会出现什么情况?

实现:

在接触到这个问题之前,肯定的说,我从来没有考虑过这个问题,不是自己不知道int型数值的取值范围,而是自己根本没有注意过这个问题,也没有想过数的取值会超过这个范围。知道这个“问题”后我做了下面的事情:

a、和同学借组,查阅相关资料,了解到下面内容

int 关键字表示一种整型,该类型根据下表显示的大小和范围存储值。

类型:int

范围:-2,147,483,648 到 2,147,483,647

大小:有符号 32 位整数

.NET Framework 类型:System::Int32 取值范围计算: 因为有一位是符号位对于负数最小值可以用1000000...(31个0)来表示.但正值只能是01111...(31个1来表示) 负数计算方式  10000000000000000000000000000001      等于 -1  10000000000000000000000000000010     等于 -2 11111111111111111111111111111111     等于    -2,147,483,647 10000000000000000000000000000000     等于 -2,147,483,648

还有这个链接里面的东西,讲了为什么int整型的范围是-32768到32767?

http://my.oschina.net/lcniuren33/blog/63762

以及C++ Primer plus 中的

b、实际操作过程,(源码、截图)

程序源代码

import java.util.Random;

import java.util.Scanner;

public class zuidazishuzu2 {

/**

* @param args

*/

public static void main(String[] args) {

// TODO 自动生成的方法存根

int array[]=new int[100000];

int flag1=0;

int flag2=0;

int flagTemp1=0;

int flagTemp2=0;//分别记录子数列的起始和结束位置

int sum,sumTemp;//表示子数列的和

Random r=new Random();

System.out.print("请输入数组元素的个数: ");

Scanner sc=new Scanner(System.in);

int number=sc.nextInt();

System.out.println("--------------------------------" +

"------------------------------------------");

System.out.print("产生的随机数序列为:     ");

for(int i=0;i<number;i++){

array[i]=r.nextInt()%10;

System.out.print(array[i]+"   ");

}

System.out.println("");

sum=array[0];

sumTemp=sum;

for(int i=0;i<number;i++){

if(sumTemp<=0){

sumTemp=0;

flagTemp1=i+1;

flagTemp2=i;

}

sumTemp+=array[i+1];

flagTemp2++;

if(sumTemp>sum){

sum=sumTemp;

flag1=flagTemp1;

flag2=flagTemp2;

}

}

System.out.print("子数组的组成元素为:    ");

for(int i=flag1;i<=flag2;i++)

System.out.print(array[i]+"    ");

System.out.println(‘\n‘+"子数组和的最大值为:    "+sum);

}

}

总结:

在java中,一旦数值超过了所定义的关键字类型的取值范围,不会报错,但是会出现不同的错误,

因此在以后的编程过程中要,当数据较大时,要有注意数据类型的选取的意识!

c、可能的解决方案

1.若知道数据的范围,可以选择适当的数值类型。

2.若是大数据,超出数值类型的表示范围,则将整型数据转化为字符串类型进行运算。

张欢龙主要负责程序分析,代码编程。

李想负责代码复审和代码测试计划。

需要指出的是,本次测试是用的张欢龙的程序,java编写的,另外,自己也测试了一下之前用C++编译的程序,出现的问题是报错,程序根本不能运行,查阅资料

http://www.cppblog.com/chenglong7997/archive/2012/06/25/180099.html

有相关的讲解。

还有:

导致内存溢出问题的原因有很多,比如:  (1) 使用非类型安全(non-type-safe)的语言如 C/C++ 等。  (2) 以不可靠的方式存取或者复制内存缓冲区。  (3) 编译器设置的内存缓冲区太靠近关键数据结构。 下面来分析这些因素: 1. 内存溢出问题是 C 语言或者 C++ 语言所固有的缺陷,它们既不检查数组边界,又不检查类型可靠性(type-safety)。众所周知,用 C/C++ 语言开发的程序由于目标代码非常接近机器内核,因而能够直接访问内存和寄存器,这种特性大大提升了 C/C++ 语言代码的性能。只要合理编码,C/C++ 应用程序在执行效率上必然优于其它高级语言。然而,C/C++ 语言导致内存溢出问题的可能性也要大许多。其他语言也存在内容溢出问题,但它往往不是程序员的失误,而是应用程序的运行时环境出错所致。 2. 当应用程序读取用户(也可能是恶意攻击者)数据,试图复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时(换言之,假设代码申请了 N 字节大小的内存缓冲区,随后又向其中复制超过 N 字节的数据)。内存缓冲区就可能会溢出。想一想,如果你向 12 盎司的玻璃杯中倒入 16 盎司水,那么多出来的 4 盎司水怎么办?当然会满到玻璃杯外面了! 3. 最重要的是,C/C++ 编译器开辟的内存缓冲区常常邻近重要的数据结构。现在假设某个函数的堆栈紧接在在内存缓冲区后面时,其中保存的函数返回地址就会与内存缓冲区相邻。此时,恶意攻击者就可以向内存缓冲区复制大量数据,从而使得内存缓冲区溢出并覆盖原先保存于堆栈中的函数返回地址。这样,函数的返回地址就被攻击者换成了他指定的数值;一旦函数调用完毕,就会继续执行“函数返回地址”处的代码。非但如此,C++ 的某些其它数据结构,比如 v-table 、例外事件处理程序、函数指针等,也可能受到类似的攻击。 来源: http://cxy.me/bbs/view35-14959-1.htm?COLLCC=2159422963&

时间: 2024-10-09 23:29:45

求int型数组和最大子数组 续的相关文章

返回一个整型数组中最大子数组的和

组员:刘伟 http://www.cnblogs.com/Lw-1573/p/5323542.html 1.题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 2.设计思想: 本题目最大的难点是如何找出子数组并且时间复杂度为O(n):我的思路是:从总左边(a[0])开始遍历整个数组,一直到最右边结束(a[n-1]),在这个过程中记录到目前

课堂练习求环整数组中最大子数组之和

设计思路:之前还有一个课堂练习,是用户输入一个整数组,求其中最大子数组之和,我借鉴的其他同学的代码,仅在此基础上修改的.运用try,catch使得用户不必在输入数组之前输入数组的长度,但是需要一个除整数以外的数来结尾.一共使用了3个循环,运用一个循环得出每个数组中最大子数组之和的最大值,一个是用来计算最大子数组之和,最后一个用来实现数组的前移.第一个循环中包着另外两个循环.总的来说,是在之前课堂练习的基础上增加了将一个数组中的每个数做一次最前面的数,从中求出最大值. 程序代码: 1 import

返回一个整型数组中最大子数组的和(02)

组员:刘伟 http://www.cnblogs.com/Lw-1573/p/5323542.html 1.要求: 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大.同时返回最大子数组的位置.求所有子数组的和的最大值. 2分析: 这个题目是在上个题目的基础的加上数组首位相连,并该数组最大子数组的和,实现方法就是把环变成直线的方法,

求整数组环中最大子数组的和(升级版)

题目:返回一个整数数组中最大子数组的和 额外要求:让数组手尾相连,构成一个环,允许a[n],a[0]...这种形式.同时返回最大子数组的位置 设计思想:将环断开,成为一条线,分析这条线上的最大子数组,找到最大子数组,便可以找到最大子数组的起点和终点,然后将终点看作起点,将起点看作终点,将线连成环,在进行寻找最大子数组(寻找时不算上起点和终点),最后将先后找到的两个最大子数组连在一起就形成了这个整数组环的最大子数组,然后将记录的起点和终点输出出来,返回最大子数组的位置. 出现的问题:无法输入更多的

返回一个二维整数组中最大子数组的和

题目:返回一个二维整数组中最大子数组的和 实验思路 根据老师上课给出的3*6的数据 我们决定设计一个3*6行的二维数组进行计算,依次进行比较 将最大子数组的和返回 代码 1 #include <iostream.h> 2 int main() 3 { 4 int a[3][6];//定义一个3*6的二维数组 5 int max; 6 int s;//求和 7 int count; 8 int b[3][7]; 9 cout<<"请输入二维数组(3*6)中的元素:"

求int型数据在内存中存储时1的个数

1.求int型数据在内存中存储时1的个数 输入一个int型数据,计算出该int型数据在内存中存储时1的个数. 我们非常easy想到例如以下方法: #include <iostream> using namespace std; int main() { int n,cnt=0; cin>>n; while(n) { if(n%2==1) cnt++; n=n/2; } cout<<cnt<<endl; return 0; } 在对代码进行測试时输入负数无法得

(一)求 int 型数据在内存中存储时 1 的个数

题目:求 int 型数据在内存中存储时 1 的个数 描述:输入一个 int 型数据,计算出该 int 型数据在内存中存储时 1 的个数 运行时间限制: 10 sec 内存限制:128 MByte 输入:输入一个整数(int 类型) 输出:这个数转换成2进制后,输出 1 的个数 1 #include <stdio.h> 2 3 int GetCount(int num) 4 { 5 /* 功能实现 */ 6 int ret = 0; 7 8 while (num) 9 { 10 num &

返回一个整数组的最大子数组和

#include<iostream>using namespace std;int max(int a,int b){ if(a>b) {return a;}else{ return b;}}int maxsum(int a[],int n){ int i;int maxsofar=0;int maxendinghere=0;for (i=0;i<n;i++){maxendinghere=max(maxendinghere+a[i],0);maxsofar=max(maxsofar

memset为int型数组初始化问题

头文件:#include <string.h>memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为:    void * memset( void * ptr, int value, size_t num );参数说明: ptr 为要操作的内存的指针. value 为要设置的值.你既可以向 value 传递 int 类型的值,也可以传递 char 类型的值,int 和 char 可以根据 ASCII 码相互转换. num 为 ptr 的前 num 个字节,size_t 就是