DHU OJ | 进阶练习-28 最大与最小 | c语言中数据类型最大值求法

28 最大与最小

作者: ZhouMingLiang 时间限制: 10S章节: 一维数组

问题描述 :

明明喜欢玩游戏,而明明的爸爸也乐意陪明明玩各种各样的小游戏。但是在游戏中,明明的爸爸又十分注意培养明明的智力,他希望通过游戏,不仅让明明得到快乐,而且又能让明明学到一些知识,锻炼他的思维能力,为将来的发展打下基础。一天,明明的爸爸和明明做起了一个叫“最大与最小”的游戏,游戏的规则简单但却很有趣,就是有M个整数,构成一个圆环,然后要在这个圆环中找出连续N个相邻的数,目的是要让这N个数的和达到最大或者最小。 例如:一共有5个整数,分别是:1、2、11、4、5,在这5个数中,取连续的3个数,然后我们能够达到的最大值是20(11+4+5),最小值是8(5+1+2)。 明明显然对这个游戏非常感兴趣,但是玩了几次后,明明发现这个游戏又并不是那么容易了,因为随着整数个数的增加,不同的取数方法越来越多,要找到最大最小值的难度就越来越高,到最后明明就变得有些不耐烦了,明明的爸爸发现了这个问题,于是就找到了你,他请你来帮明明一把,写一个程序,把这个环中可能达到的最大最小值找出来,然后告诉明明,而明明只需要找到是哪几个连续的数组成了最大最小值即可,这样可以节约很多的时间。 明明爸爸的问题可以归结为:在一个由M个整数构成圆环中,找出N个相邻的数,使其和为最大或最小。

输入说明 :

你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据有二行,测试数据的第一行包含个两个整数M、N(1≤N≤M≤100),M表示圆环中整数的个数,N表示要连续取出的数的个数,M和N用一个空格隔开;测试数据的第二行有M个整数,即圆环中的数,每个数之间用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明 :

对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果有两行,第一行首先输出“Max=”(不包含双引号),然后紧跟一个整数,即圆环中连续N个数的最大值;第二行首先输出“Min=”(不包含双引号),然后紧跟一个整数,即圆环中连续N个数的最小值。每组运算结果的行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。 注:通常,显示屏为标准输出设备。

输入范例 :

8 4
1 7 8 2 6 5 4 3
5 3
1 2 3 4 5

输出范例 :

Max=23
Min=13

Max=12
Min=6

笔记

这道题我是暴力穷举出来的。

这里主要记录一下求数据类型的能表示的最大数的方法。

无符号数据类型的能表示的最大数 = 2^(字节数 * 8),有符号数据类型还要折半再减一。用c语言表示如下:

const int MAX = pow(2,sizeof(int)*8)/2-1;

其中,函数pow在头文件math.h中声明,函数原型为:

double pow(double x, double y)

表示x的y次方。

代码

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

const int MAX = pow(2,sizeof(int)*8)/2-1;
const int MIN = -1;

int main(){
	int m,n;
	int num[101];
	int flag = 1;
	while(scanf("%d %d",&m,&n)!=EOF){
		int i,j;
		for(i=0;i<m;i++) {
			scanf("%d",&num[i]);
		}
		
		int min = MAX,max = MIN;
		int sum = 0;
		for(i=0;i<m;i++){
			sum = 0;
			for(j=0;j<n;j++){
				int index = i+j;
				if(index>=m){
					index = index % m;
				}
				sum+=num[index];
			}
			if(sum>max){
				max = sum;
			}
			if(sum<min){
				min = sum;
			}
		}
		
		if(flag){
			flag = 0;
		}else{
			printf("\n\n");
		}
		printf("Max=%d\nMin=%d",max,min);
	}
	
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值