北邮oj-非平方不等式

博客指出暴力枚举解题会超时,关键在于缩小x的范围。通过对x*x+s(x)*x - n = 0推导,得出x<sqrt(n)、x + s(x)>sqrt(n),进而确定x的范围为sqrt(n)-81<x<sqrt(n),还给出相关参考文章链接及代码提示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
在这里插入图片描述
本题暴力枚举很容易想到,但也会超时。
关键在于缩小x的范围。
https://blog.youkuaiyun.com/birdstorm_s/article/details/20386413
https://blog.youkuaiyun.com/cqhblg/article/details/87258816
这两篇大神的文章讲得很清楚。
由x*x+s(x)*x-n=0推导

xx+s(x)x=n
x
(x+s(x))=n
所以x<sqrt(n),x+s(x)>sqrt(n)
因为x<sqrt(n),所以x<10^9
所以s(x)<=9
9=81
所以sqrt(n)-81<x<sqrt(n)
这就是x的范围

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL s(LL x){//求和函数
	LL result=0;
	while(x!=0){
		result+=x%10;
		x=x/10;
	}
	return result;
}
int main(){
	LL x,n;
	while(scanf("%lld",&n)!=EOF){
	bool flag = false;	//n是long long类型,sqrt(n)也是long long类型,所以下面的x也要是long long类型,不然不能比较,oj提示错误。
	for(LL x=(LL)sqrt(n)-81;x<=(LL)sqrt(n);x++){
		if(x>0&&x*x+s(x)*x==n){//当n较小时,sqrt(n)-81<0,排除这种情况
			printf("%lld\n",x);
			flag = true;
			break;
		}
	}
	
	if(flag==false)
	 printf("-1\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值