求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&
求int型数组和最大子数组 续的更多相关文章
- 057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和
057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和 本文知识点:求整型数组的数组元素的元素值累加和 案例:求整型数 ...
- (一)求 int 型数据在内存中存储时 1 的个数
题目:求 int 型数据在内存中存储时 1 的个数 描述:输入一个 int 型数据,计算出该 int 型数据在内存中存储时 1 的个数 运行时间限制: 10 sec 内存限制:128 MByte 输入 ...
- 求int型数据在内存中存储时1的个数
1.求int型数据在内存中存储时1的个数 输入一个int型数据,计算出该int型数据在内存中存储时1的个数. 我们非常easy想到例如以下方法: #include <iostream> u ...
- php实现 求int型数据在内存中存储时1的个数(函数都可自己实现)
php实现 求int型数据在内存中存储时1的个数(函数都可自己实现) 一.总结 一句话总结:函数我们自己都可以实现,尤其是很多基础函数,没有工具的时候自己写. 1.php进制转换函数? base_co ...
- 华为机试 求int型数据在内存中存储时1的个数
题目描述 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: 输入一个整数(int类型) 输出描述: 这个数转换成2进制后,输出1的个数 输入 5 输出 2 普通运算方 ...
- 转:一道笔试题-将int型数组强制转换为char*,再求strlen,涉及大小端
写出如下程序运行结果: #include<stdio.h> #include<string.h> int main() { int a[2000]; char *p = (ch ...
- C笔试题:将int型数组强制转换为char*,再求strlen,涉及大小端
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 int a[2000]; 6 char *p = (ch ...
- memset为int型数组初始化问题
头文件:#include <string.h>memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为: void * memset( void * ptr, int ...
- 编写Java程序,将一个int型数组拼接成字符串
返回本章节 返回作业目录 需求说明: 将一个int数组中的元素拼接成int元素以逗号分隔字符串. 实现思路: 定义一个数组变量int[] arrs = {12,21,33,9,2}. 定义一个方法ar ...
随机推荐
- Hive HBase Integration 集成
官方文档:https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration 1.在hive/lib目录下找到hive-hbase-ha ...
- SQL基础语法的单表操作 select|insert|update|delete(增删改查) 简单使用
以下案列以此表举例 1.select(查询) select简单的查询分为两种 注:字段也就是表结构中的列的名称 第一种: select 字段名 from 表名 此种查询只列出你所需要查询的字段, ...
- 详解 Python3 正则表达式(五)
上一篇:详解 Python3 正则表达式(四) 本文翻译自:https://docs.python.org/3.4/howto/regex.html 博主对此做了一些注明和修改 ^_^ 非捕获组和命名 ...
- Golang设计模式—简单工厂模式(Simple Factory Pattern)
Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...
- linux ssh 连接设置
! 本文编辑中 centos ssh 无法连接
- sqlserver分区视图中分区列的规则
分区列规则 分区列存在于每个成员表上,并且通过 CHECK 约束标识特定表中的可用数据.分区列必须遵守如下规则: 每个基表都拥有键值由 CHECK 约束所强制的分区列.每个表的 CHECK 约束的键范 ...
- JavaWeb总结(三)
什么是Servelt - 是运行在Web服务器或应用服务器上的Java程序 - 在Web上创建动态内容的有效而强大的解决方案 - 由容器来管理生命周期与Web服务器交互 Servlet规范的组成 Ja ...
- USACO Section1.1
本系列博客主要学习和记录USACO的相关代码和总结,附上我的github地址. 什么是USACO USACO全称是The USA Computing Olympiad,主要目的是从美国高中生中选出代码 ...
- browser-sync 文件监听失败的解决方案
问题 为了方便实时预览前端开发过程中修改源码后的页面,我在全球最大的同性交友网Github中找到了一个非常实用的工具,browser-sync. 安装使用方式请自行到官网https://browser ...
- js获取字符串字节数方法小结
js获取字符串字节数的方法.分享给大家供大家参考.具体如下: 大家都知道,获取字符串的长度可用length来获取,那么获取这段字符串的字节数呢? 英文字母肯定lenght和字节数都一样:都是1而中文l ...