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

Lymp_Lymm 2026-04-28 19:25:46

这是平方和公式做的 

#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
也就是说有一个代码逻辑错了或者说有什么地方超出了,所以到底我没考虑到哪里(如果我在平方和公式计算过程中模偏差更大)

...全文
77 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

6

社区成员

发帖
与我相关
我的任务
社区描述
一起cpp
c++ 个人社区
社区管理员
  • 鸟哥01
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧