B.Arithmetic Progression(13.7.7)

B.Arithmetic Progression

 

   “Inmathematics, an arithmetic progression (AP) or arithmetic sequence is asequence of numbers such that the difference between the consecutive terms isconstant. For instance, the sequence 5, 7, 9, 11, 13, … is an arithmeticprogression with common difference of 2.”

-   Wikipedia

 

Thisis a quite simple problem, give you the sequence, you are supposed to find thelength of the longest consecutive subsequence which is an arithmeticprogression.

 

Input

Thereare several test cases. For each case there are two lines. The first linecontains an integer number N (1 <= N <= 100000) indicating the number ofthe sequence. The following line describes the N integer numbers indicating thesequence, each number will fit in a 32bit signed integer.

 

Output

Foreach case, please output the answer in one line.

 

Sample Input

6

1 4 7 9 11 14

 

Sample Output

3

错误代码:

#include<iostream>
using namespace std;
int main(){
	int n;
	int k;
	int flag=1;
	int p[100000];
	while(cin>>n){
	for(int i=0;i<n;i++){
		cin>>p[i];
	}
	if(n==1){flag=0;}
	else if(n==2){flag=1;}
	else{
		for(int j=0;j+2<n;j++){
		k=p[j+1]-p[j];
		if(k==p[j+2]-p[j+1]){flag++;}
		else{
			j=flag;
			break;}}}
	    cout<<(flag+1)<<endl;
	}
	return 0;
}
这个代码总是提示超时,所以很长时间我在想办法进行优化,但是尝试数次后,依旧还是超时,在后来拿到测试数据后,进行测试,发现,着代码的答案根本就好似错误的,我理解错了题目的意思,这个代码求得是一系列数字的最大的相邻差,我很不理解为什么判定系统为什么仅仅是判定超时
正确代码:
#include<iostream>
using namespace std;
inline int fun(int *p,int k,int h){
	int x=1;
	for(int m=0;m+h+1<k;m++){
		if(p[h]==p[m+h+1]-(m+1)*(p[h+1]-p[h])){x++;}
		else{break;}
	}
	return x;}
int main(){
	int n;
	int num[100001];
	int z=1;
	while(cin>>n){
		for(int i=0;i<n;i++){
		cin>>num[i];}
		if(n==1){cout<<"1"<<endl;}
		if(n==2){cout<<"2"<<endl;}
		if(n>=3){
			int j=0;
			z=fun(num,n,j);
			j=j+z;
			while(j<n){
				if(z<fun(num,n,j-1)){
					z=fun(num,n,j-1);
					j=j+z-1;
				}
				else{j=j+fun(num,n,j-1)-1;}
			}
			cout<<z<<endl;;
		}
	}
	return 0;
}
题目的正确意思是在一串数字中找到最长的等差数列,并且将等差数列的个数输出,由于题目给出的数据的巧合,我很长时间认为是在求最大相邻差值,在进行此代码输入的时候,曾很长时间j=j+z;这让我纠结很久,无论这个位置向后的第一组等差数列是不是最长的,都往后移动的的数组个数都应该是这个数列的个数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是Java中的一个异常,意思是需要进行四舍五入。通常是因为进行了除法运算,但结果不能被精确表示为一个整数或小数。解决方法是使用BigDecimal类进行精确计算,或者使用Math.round()方法进行四舍五入。 ### 回答2: java.lang.ArithmeticException: rounding necessary是Java中的一个异常。它表示在进行数值运算时,需要进行舍入操作。在Java中,当进行除法或四舍五入等运算时,如果结果不是一个整数,则需要进行舍入以获得最接近的整数或指定的小数位数。 这个异常通常发生在以下情况下: 1. 当进行除法运算时,如果除数不能整除被除数,则需要进行舍入才能得到结果。如果无法进行舍入操作,就会抛出该异常。 2. 当通过四舍五入方式将一个小数转换为整数或指定小数位数时,如果需要进行舍入操作才能得到结果,则会抛出该异常。 为了解决这个异常,我们可以采取以下措施: 1. 检查除法运算中的被除数和除数,确保能够整除,避免出现舍入错误。如果无法整除,则需要重新设计算法或找到其他解决方案。 2. 在进行四舍五入运算时,可以使用Java中的Math类提供的方法,如Math.round()来进行舍入操作。此外,还可以考虑使用BigDecimal类来处理精确的小数运算,它提供了很多可以进行舍入操作的方法。 总之,当我们在Java中遇到java.lang.ArithmeticException: rounding necessary异常时,表示在进行数值运算时需要进行舍入操作。要解决这个异常,我们需要检查除法运算中的被除数和除数,以及使用适当的方法进行舍入操作,保证结果的准确性。 ### 回答3: Java.lang.ArithmeticException: rounding necessary 是一个在Java中的异常类型。它表示在进行数值运算时需要进行四舍五入操作。 在进行数值运算时,可能会出现无法准确表示的结果,特别是涉及到浮点数和小数点的运算。由于计算机的内部表示方式有限,无法完美地表示所有的小数和浮点数。这就导致了某些运算结果的尾数部分可能无法精确表示,需要进行四舍五入操作。 当进行一个数值运算时,如果该运算需要进行四舍五入操作以确保结果的准确性,但是没有指示具体的四舍五入策略时,就会抛出 java.lang.ArithmeticException: rounding necessary 异常。 要解决这个异常,可以使用合适的四舍五入策略来确保数值运算的准确性。Java中提供了 BigDecimal 类来处理高精度的数值计算,它可以指定要使用的四舍五入策略。在进行数值运算时,可以使用 BigDecimal 类来处理数值,并指定需要使用的四舍五入策略,从而避免 java.lang.ArithmeticException: rounding necessary 异常的发生。 总之,解决 java.lang.ArithmeticException: rounding necessary 异常的方法是使用 BigDecimal 类来处理数值运算,并指定合适的四舍五入策略。这样可以确保数值运算的准确性,避免出现无法精确表示的结果导致的异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值