为什么平方和公式和直接累加平方数结果不一样

Lymp_Lymm Lymp_Lymm 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

这是平方和公式做的 

#include<iostream>
using namespace std;
int main(){
    long long a,b;
    cin>>a>>b;
    long long min=0;
    for(long long i=a;i<=b;i++){
        long long tst=sqrt(i);
        if(tst*tst==i){
            min=tst;
            break;
        }
    }
    long long max=0;
    for(long long i=b;i>=a;i--){
        long long tst=sqrt(i);
        if(tst*tst==i){
            max=tst;
            break;
        }
    }
    min-=1;
    cout<<((max*(max+1)*(2*max+1))/6 - (min*(min+1)*(2*min+1))/6)%INT_MAX ;
}
//min是范围内第一个完全平方数,max是最后一个/就是只要我用平方和公式把1-max的平方和减去1-min-1的平方和就是范围内所有完全平方数和

 这是累加完全平方数暴力做的

#include<iostream>
using namespace std;
long long llsqrt(long long a){
	long long b=(long long)sqrt(a);
	return b;
}
long long sqrtst(long long a,long long b){
	if(a > b) return 0;
	long long sum=0;
	long long fst;
	int s=0;
	for(long long i=a;i<=b;i++){
		long long tst=(long long)sqrt(i);
		if(tst*tst==i){
			fst=i;
			s=1;
			break;
		}
	}
	if(s==0){
		return 0;
	}
	for(long long i=fst;i<=b;i+=llsqrt(i)*2+1){
		sum+=i;
		sum%=INT_MAX;
	}
	return sum;
}
int main(){
	long long a,b;
	cin>>a>>b;
	cout<<sqrtst(a,b);
}
/*原理是两个完全平方数之间是连续奇数关系也就是假设完全平方数a是b的平方 则下一个完全平方数是a+2b+1
当然也可以直接sqrt(a)+1平方
*/

两个我都模了INT_MAX也就是2^31-1但是当我把测试点变成1 10000000000000时两个代码之间偏差了2
也就是说有一个代码逻辑错了或者说有什么地方超出了,所以到底我没考虑到哪里(如果我在平方和公式计算过程中模偏差更大)

...全文

相关推荐

评论
收藏 已收藏
分享
返回顶部