不同语言在算法使用方面的差异(Java 、C++篇)

devtools/2024/9/24 13:33:27/

由于我认为的会了是能得到结果了,所以我亲自去把题解的C++代码给改成了Java的,尽管代码和逻辑上的高度统一。编译器还是报错了。

第三个死都过不去。而且后面的还超时了。

这使我十分怀疑是不是超时或者空间不够所导致的。但是去问讯飞星火,它说超时或者空间会Runtime 什么的,就觉得还是代码逻辑的错了。

java">import java.util.*;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int N = scan.nextInt();int K = scan.nextInt();scan.nextLine();int number = 0;int[] sum = new int[N + 1];int[] f = new int[K];for (int i = 1; i <= N; i++) {sum[i] = scan.nextInt() + sum[i - 1];scan.nextLine();}for (int i = 0; i <= N ; i++) {number += f[ sum[i] % K ]; f[ sum[i] % K ] ++;}System.out.println(number);}
}

然而我怎么检查和对照都找不到问题,就当我快要对这个卡了我几个小时崩溃小时的问题放手的时候,我想起之前题解和讨论区里有说要用到long long我给忽略了。这马上就回去找。

好家伙,连错误的原因都一样——

题解里也是

再看看修改的源代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,s[100005],ans=0,xb[100005];//s前缀和数组,xb用于存储模数
signed main(){cin>>n>>k;for(int i=1,t;i<=n;i++)cin>>t,s[i]=s[i-1]+t;for(int i=0;i<=n;i++)//注意!必须从0开始ans+=xb[s[i]%k]++;//有n个模数相同中间就有(n-1)段和为k的倍数cout<<ans;return 0;
}
java">#define int long long

有一个这个,我问了问讯飞,它告诉我

这是把 int 全部变成了 long long类型

这才恍然大悟,原来是数据溢出导致的

然而Java没有long long数据类型,而且Java的long类型和C++的是一样大的。更大的只能是BigInteger,然而。。。

java">import java.math.BigInteger;
import java.util.*;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);BigInteger N = scan.nextBigInteger();BigInteger K = scan.nextBigInteger();scan.nextLine();BigInteger number = BigInteger.ZERO;BigInteger[] sum = new BigInteger[N.intValue() + 1];BigInteger[] f = new BigInteger[K.intValue()];for (int i = 1; i <= N.intValue(); i++) {sum[i] = scan.nextBigInteger().add(sum[i - 1]);scan.nextLine();}for (int i = 0; i <= N.intValue(); i++) {number = number.add(f[sum[i].mod(K).intValue()]); // 修改这里f[sum[i].mod(K).intValue()] = f[sum[i].mod(K).intValue()].add(BigInteger.ONE); // 修改这里}System.out.println(number);}
}

会导致

直接爆了。

一般来说,对于相同逻辑的算法,C++的性能通常优于Java。这主要是由于以下几个原因:

  1. 编译与解释: C++是一种编译型语言,源代码在执行前被编译成机器码,因此执行速度快。 Java是解释型语言(尽管也有JIT编译,但与传统的编译语言相比有所不同),代码在运行时需要被解释或即时编译,这会带来额外的开销。

  2. 运行时环境: Java程序运行在Java虚拟机(JVM)上,JVM提供了跨平台的便利,但也带来了性能上的开销。 C++直接运行在操作系统之上,没有额外的运行时环境,因此通常具有更快的执行速度。

  3. 内存管理: C++允许程序员直接管理内存,这可以使内存分配更加高效,但同时也增加了出错的风险。 Java有自动垃圾回收机制,虽然简化了内存管理,但可能会增加内存和时间的开销。

  4. 系统调用和库函数: C++可以直接调用操作系统的API,减少了中间层的开销。 Java的系统调用需要通过JVM,可能会有额外的开销。

  5. 优化: C++编译器可以进行广泛的优化,包括针对特定硬件的优化。 Java代码的优化由JVM负责,可能不如C++编译器那么深入或针对性强。

  6. 数据类型和结构: C++中的数据类型和结构通常更紧凑,没有额外的对象头信息等。 Java中的对象包含额外的信息,如对象头、类型信息等,这会增加内存的使用。

  7. 泛型和模板: C++的模板在编译时实例化,不会产生额外的运行时开销。 Java的泛型在运行时通过擦除实现,可能会引入一些额外的类型检查和转换开销。

  8. 异常处理: Java的异常处理机制可能会引入额外的时间和内存开销。 C++的异常处理(如果使用)通常更直接,开销较小。

是这样的。有的算法Java不能直接用。


http://www.ppmy.cn/devtools/23654.html

相关文章

【Qt】error LNK2001: 无法解析的外部符号

参考&#xff1a;Qt/VS LNK2019/LNK2001&#xff1a;无法解析的外部符号_qt lnk2001无法解析的外部符号-CSDN博客 微软官方报错文档-链接器工具错误 LNK2019 __declspec error LNK2001: 无法解析的外部符号 "__declspec(dllimport) 原因 以这种为前缀的基本上跟库相关…

国产Sora诞生!清华团队发布Vidu大模型,可直接生成16秒视频

大模型之争已从单模态转向多模态。 4月27日&#xff0c;在2024中关村论坛年会未来人工智能先锋论坛上&#xff0c;清华大学联合北京生数科技有限公司正式发布了文生视频大模型——Vidu。 在会议上&#xff0c;清华大学人工智能研究院副院长、生数科技首席科学家朱军对外展示了…

YOLO新鲜腐烂水果检测数据集:8类,11000多张图像,标注完整

YOLO新鲜腐烂水果检测数据集&#xff1a;8类&#xff0c;11000多张图像&#xff0c;yolo标注完整&#xff0c;包含烂苹果&#xff0c;烂香蕉&#xff0c;烂橙子&#xff0c;烂石榴&#xff0c;好苹果&#xff0c;好香蕉&#xff0c;好橙子&#xff0c;好石榴8个类别 图像统一分…

快速排序思想及实现

思想(从小到大排序) 总体 对数组进行分区&#xff0c;选定一个元素作为基准&#xff0c;然后将小于基准的元素放在基准的左边&#xff0c;将大于基准的元素放在基准右边&#xff0c;分区完成之后再对左边的元素和右边的元素分别进行分区&#xff0c;直到左右区间不可再分。这…

sky13笔记

1.generate用法 generate是物理上的展开&#xff0c;在compile时完成展开。 e.g.把array里面的每一项放入scale&#xff1a; wire [7:0] array [0:7]; wire [8*8-1 :0]scale; generate genvar gen_x; for(gen_x 0; gen_x <8; gen_x gen_x 1)begin:gen_scaleassign scale[ge…

vue3使用echarts做树图tree

vue3使用echarts做树图tree 1.安装echarts npm install echarts --save2.在main.js引入 import * as echarts from echarts // 全局方法 app.config.globalProperties.$echarts echarts3.使用 <div id"myChart" :style"{ width: 1000px, height: 1000px …

信号分解 | SSA(奇异谱分析)-Matlab

分解效果 SSA(奇异谱分析) 信号分解 | SSA(奇异谱分析)-Matlab 奇异谱分析(Singular Spectrum Analysis,简称SSA)是一种用于时间序列分析的方法。它可以用于数据降维、信号分解、噪声去除和预测等应用。 SSA的基本思想是将时间序列分解为若干个成分,每个成分代表着不同的…

【Redis | 第十篇】Redis与MySQL保证数据一致性(两种解决思路)

文章目录 10.Redis和MySQL如何保证数据一致性10.1双写一致性问题10.2数据高度一致性10.3数据同步允许延时10.3.1中间件通知10.3.2延迟双删 10.Redis和MySQL如何保证数据一致性 10.1双写一致性问题 Redis作为缓存&#xff0c;它是如何与MySQL的数据保持同步的呢&#xff1f;特…