巧题 | 北邮OJ | 130. 非平方等式

本文探讨了两种不同的搜索算法实现方式,一种是通过线性搜索解决特定数学问题但遭遇超时,另一种则通过缩小搜索范围实现了算法的优化与加速。文章详细展示了两种算法的代码实现,并对比了其效率,为读者提供了算法优化的实践案例。

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

https://vpn.bupt.edu.cn/http/10.105.242.80/problem/p/130/

线性搜索,超时代码

/*
USER_ID: test#shizhuxiniubi
PROBLEM: 130
SUBMISSION_TIME: 2019-02-04 08:31:57
*/
#include <bits/stdc++.h>
#define FF(a,b) for(int a=0;a<b;a++)
#define F(a,b) for(int a=1;a<=b;a++)
#define LEN 100
#define INF 1000000
#define bug(x) cout<<#x<<"="<<x<<endl;
 
using namespace std;
typedef long long ll;
const double pi=acos(-1);
 
ll s(int x){
    ll ans=0;
    while(x){
        ans+=x%10;
        x/=10;
    }
    return ans;
}
 
int main()
{
//    freopen("./in","r",stdin);
    ll n,x;
    cin>>n;
    for(x=1;1;x++){
        if(x*x>n){
            puts("-1");
            break;
        }
        if(x*x+s(x)*x==n){
            printf("%lld\n",x);
            break;
        }
    }
 
    return 0;
}

缩小搜索范围,AC代码

#include <bits/stdc++.h>
#define FF(a,b) for(int a=0;a<b;a++)
#define F(a,b) for(int a=1;a<=b;a++)
#define LEN 100
#define INF 1000000
#define bug(x) cout<<#x<<"="<<x<<endl;

using namespace std;
typedef long long ll;
const double pi=acos(-1);

ll s(int x){
    ll ans=0;
    while(x){
        ans+=x%10;
        x/=10;
    }
    return ans;
}

int main()
{
//    freopen("./in","r",stdin);
    ll n,x,ans=-1,k;
    cin>>n;
    for(x=(ll)sqrt(n)+1,k=0;
        x>=0 && k<18*9;
        x--,k++){
            if(x*x+x*s(x)==n){
                ans=x;
                break;
            }
        }
    cout<<ans<<endl;
    return 0;
}

<think>嗯,用户想找关于oj.icode8.cn这个Java在线库的使用方法或目解析。首先,我需要确认这个平台是否存在,或者是否可能有拼写错误。因为用户提到参考引用里有输入输出的问,可能这个平台和机考相关,比如处理输入输出比较麻烦。 用户提到他们引用的内容是关于输入输出样,90%的人失败在输入处理上。所以可能这个平台的目需要特别注意输入输出的处理,这在Java中尤其重要,因为Java的输入方式相对复杂,比如Scanner和BufferedReader的区别。 接下来,我需要假设这个oj.icode8.cn是一个类似在线判系统(OJ)的平台,类似于LeetCode或者牛客网。可能用户需要知道如何在这个平台上使用Java进行编程练习,包括如何正确读取输入,处理数据,以及输出结果。 首先,用户可能需要了解平台的基本使用方法,比如如何注册、如何选择目、如何提交代码。其次,目解析方面,可能需要给出一些常见型的解思路,尤其是输入输出的处理技,比如多行输入、循环读取等。 另外,考虑到Java在OJ中的常见问,比如Scanner的效率问,可能推荐使用BufferedReader来提高读取速度,尤其是在处理大数据量的时候。此外,还要注意类的命名,有些OJ要求主类必须为Main,否则会编译错误。 可能需要给出一个具体的例子,比如如何处理多行输入,如何解析字符串,转换成整数数组等。这些是常见的输入处理场景,用户可能在目中经常遇到。 还要注意输出格式,比如末尾空格或换行符的问,这些细节可能导致答案错误。需要提醒用户严格按照目要求的格式输出。 此外,可能用户遇到的目类型包括算法、数据结构等,需要针对不同的型给出解析方法,比如排序、查找、动态规划等,并结合Java的特性进行实现。 最后,可能需要推荐一些资源,比如该平台的常见问解答、讨论区,或者相关的Java编程技文章,帮助用户更好地使用这个平台。</think>关于Java在线oj.icode8.cn的使用方法及目解析,以下是分步说明: 1. **平台访问与注册** - 访问官网oj.icode8.cn完成注册后,在库分类中选择"Java专项" - 注意需使用JDK8及以上环境进行编程[^1] 2. **输入输出规范** ```java // 推荐使用BufferedReader提升读取效率 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] params = br.readLine().trim().split(" "); int n = Integer.parseInt(params[0]); // 输出注意末尾换行 System.out.println(result); ``` 3. **典型目解析示例** **目:二维数组对角线求和** ```java public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int[][] matrix = new int[n][n]; // 读取矩阵 for(int i=0; i<n; i++){ String[] row = br.readLine().split(" "); for(int j=0; j<n; j++){ matrix[i][j] = Integer.parseInt(row[j]); } } // 计算对角线 int sum = 0; for(int i=0; i<n; i++){ sum += matrix[i][i] + matrix[i][n-1-i]; } System.out.println(sum); } } ``` 4. **常见错误处理** - 数组越界:注意目输入的索引范围 - 类型转换:使用`Integer.parseInt()`时需捕获`NumberFormatException` - 内存限制:避免使用过大的静态数组 5. **调试技** - 本地测试时创建`input.txt`文件模拟输入 - 使用`System.out.println()`中间输出调试
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值