Java在线笔试编程(4)----计算质数

笔试分享:2020-08-19 目录华为笔试购物管理(leetcode-860)满足强迫症x形输出字符串迷宫问题字符串修正在线学习系统反序链表2019年全量字符集和已占用字符集Trie树逻辑计算 华为笔试 购物管理(leetcode-860) def sol(bills): five, ten = 0, 0 for i in range(len(bills)): ## 付的是5元,直接收 if bills[i] == 5: five += 1 ## 阅读详情

题目来自于2017年搜狗公司在线笔试。

题目如下:定义两个大于2的偶数之间的距离,为这两个数之间质数的个数。从小到大输入n个大于2的偶数,输出所有数两两之间距离的总和(应该有n*(n-1)/2个距离,输出总和就好)。

输入描述:

第一行是输入偶数的个数,最小为2,最大可能到几万,之后每行为一个偶数,最小为4,最大可能为到几百万,不重复的升序排列。

输出描述:

输入数据两两距离的总和,这应该是一个不小于0 的整数。

输入样例:

3
4
6
12
输出样例:

6

此题看起来求个质数嘛,很简单,其实是有点难度的,关键在于偶数可能为几百万,而规定的最大运行时间为4000ms。也就是要求复杂度不能过高。

这里我先给出常规的求质数的3个算法,第一个算法最慢,第二个次之,第三个最快。其中第二个、第三个方法参考至网上代码。

1.普通算法

private static int findZhiShu(int num) {
		int counts = 0;
		if (num < 2) {
			return counts;
		}
		for (int i = 2; i <= num; i++) {
			boolean isZhiShu = true;
			for (int j = 2; j <= i / 2; j++) {
				if (i % j == 0) {
					isZhiShu = false;
					break;
				}
			}
			if (isZhiShu) {
				System.out.print(i + " ");//输出质数
				counts++;
			}
		}
		return counts;
	}

这个方法在10万左右时就比较耗时了。

2.优化算法
private static int findZhiShu(int num) {
		int counts = 0;
		if (num < 2) {
			return counts;
		}
		for (int i = 2; i <= num; i++) {
			boolean isZhiShu = true;
			double index=Math.sqrt(i);
			for (int j = 2; j <=index; j++) {
				if (i % j == 0) {
					isZhiShu = false;
					break;
				}
			}
			if (isZhiShu) {
				System.out.print(i + " ");//输出质数
				counts++;
			}
		}
		return counts;
	}
这里用到了取平方的方法,缩小了查找的范围,原因如下:

     循环到sqrt(N)即可,简单解释一下:因数都是成对出现的。比如,100的因数有:1和100,  
     2和50,4和25,5和20,10和10。看出来没有?成对的因数,其中一个必然小于等于100的开平方,另一个大于等于100的开平方。 

这个方法只能在百万级以下的数时,在3秒以内。

3.进一步优化的算法

private static int findZhiShu(int n){  
        boolean[] primes= filterNumber(n);  
        int num=0;  
        if(primes!=null){  
            for(int i=1;i<primes.length;i++){  
                if(primes[i]){  
              //    System.out.print(i+" "); //打印质数
                  num++;
                }  
            }  
        }  
       // System.out.println("一共有"+num+"个质数");  
         return num; 
    }  
 //筛选法  
    private static boolean[] filterNumber(int num){  
        if(num<=0){  
            System.out.println("范围必须大于0");  
            return null;  
        }  
        boolean[] isPrime = new boolean[num + 1];  
        isPrime[1] = false;  
        Arrays.fill(isPrime,2,num,true);  
        int n = (int)Math.sqrt(num);  
        for(int i=1;i<=n;i++){  
            if(isPrime[i]){  
                for(int j=i*i;j<=num;j+=i){  //2*i改为i*i可以避免重复赋值,效率提升了约6%
                    isPrime[j]= false;  
                }  
            }  
        }  
        return isPrime;  
    }  
用到的是筛选法。依次剔除2的倍数,3的倍数,5的倍数......

这个算法可以有效的对付9位数(上亿),我计算机测试输入123456789时,花费时间在3秒以内,在计算大数时,效率大约是第二种的80-100倍左右.


毫无疑问,必须得选第三种方法。

参考代码如下:

import java.util.Arrays;
import java.util.Scanner;

public class Test0 {
   
	public static void main(String[] args) {
		Scanner mScanner = new Scanner(System.in);
		int len = mScanner.nextInt();
		int counts = 0;
		int array[] = new int[len];
		for (int i = 0; i < len; i++) {
			array[i] = mScanner.nextInt();
		}	
	//  long time0=System.currentTimeMillis();
		for (int i = 0; i < len-1; i++) {
			for (int j = i+1; j < len; j++) {
				counts += findZhiShu(array[j])-findZhiShu(array[i]);
			}
		}
	//	long time1=System.currentTimeMillis();
	
        System.out.println(counts);
    //  System.out.println((double)(time1-time0)/1000);
 

	}
	  //筛选法  
    private static boolean[] filterNumber(int num){  
        if(num<=0){  
            System.out.println("范围必须大于0");  
            return null;  
        }  
        boolean[] isPrime = new boolean[num + 1];  
        isPrime[1] = false;  
        Arrays.fill(isPrime,2,num,true);  
        int n = (int)Math.sqrt(num);  
        for(int i=1;i<=n;i++){  
            if(isPrime[i]){  
                for(int j=i*i;j<=num;j+=i){  //2*i改为i*i可以避免重复赋值,效率提升了约6%
                    isPrime[j]= false;  
                }  
            }  
        }  
        return isPrime;  
    }  
    
    private static int findZhiShu(int n){  
        boolean[] primes= filterNumber(n);  
        int num=0;  
        if(primes!=null){  
            for(int i=1;i<primes.length;i++){  
                if(primes[i]){  
              //    System.out.print(i+" "); //打印质数
                  num++;
                }  
            }  
        }  
       // System.out.println("一共有"+num+"个质数");  
         return num; 
    }  

}

后面给出我测试的结果

                        



对上面有什么疑问,欢迎交流指出,共同进步!




云端编码新风尚:4款Java在线编辑器大比拼,谁是程序员最爱? 在线Java编辑器是一种无需安装任何软件,只需通过网页浏览器即可编写、编译和运行Java代码的工具,非常适合快速测试代码片段、学习Java语言或进行轻量级的编程任务。以下是几个知名的在线Java编辑器的简介及特点,虽然无法直接提供代码示例,我会简要说明它们的使用流程和特性。 阅读详情

相关推荐

2025.04.05-美团春招笔试第二题

所有的质数都是漂亮数。因为对于质数 p,它能被自身整除(p mod p = 0),且 p*p ≥ p 总是成立。关键点是计算每个数的最大质因子。如果一个数的最大质因子 p 满足 p*p ≥ 该数,那么这个数就是漂亮数。这种方法的时间复杂度为 O(n),空间复杂度为 O(n),可以高效处理 n 高达 5×10^6 的情况。对于合数,我们需要判断它是否有一个质因子 p,使得 p*p ≥ 该数。,你能否求出有多少漂亮数小于等于。输出一行一个正整数,代表小于等于。

春秋招笔试突围 234

Java 在线编程编译工具上线,直接运行Java代码

大家好,我是小哈~周末没出去浪,花了点时间,在我的个人网站上线了一款小工具。啥工具呢?一款可以在线编译 Java 代码并运行输出结果的小工具。大家都知道,甲骨文刷 Java 版本号非常积极,这不上个月 20 版本又来了。你发任你发,我用 Java 8。狗头~每次发布新版本,小哈都会看下新特性,比如新语法啥的。这里就有个痛点,我本人机器安装的 JDK 1.8 版本,想要测试一下新语法,就不得不需要安装新的 JDK,然后切换到新的 JDK,测试完后又得切换回 1.8 版本,比较麻烦。

犬小哈 5319

2016完美世界招聘笔试题———互联网Java开发

国庆之后一直忙于很多事,今天翻得原来的笔试题,做了一些放在这里,望对有需要的能有所帮助。 第2题答案:http://blog.csdn.net/uniquewonderq/article/details/48113071 第1题答案: package test; public class test { public static void main(Stri

5756

OJ在线编程输入输出(Java版)

1.如果全部是数字while 中可以使用 hasNextInt()2.如果全部是字符串,可以一行一行读,使用 hasNextLine()3.如果一行中既有字符串又有数字,则可以直接读取一行,hasNextLine()。定义一个String 类型的数组,最后再按空格 spilt() ,或者其他什么要求进行分割就行。再把String 类型的数字转化成 int 类型 :Integer.parseInt()。t=M85B。

weixin_61567666的博客 2481

【2025年OPPO秋招-8月31日-第一题(100分)- 质数整数对】(题目+思路+Java&C++&Python解析+在线测试)

摘要: 题目要求对每个给定的质数 $n$,求解满足 $(a+b)(a-b)=n$ 的整数对 $(a,b)$。通过变量替换,将问题转化为分解 $n$ 的因数对 $(x,y)$,并分析奇偶性:当 $n$ 为奇质数时,唯一解为 $a=\frac{n+1}{2}, b=\frac{n-1}{2}$;对于 $n=2$,无解。算法时间复杂度为 $O(1)$ 每组数据,适用于大规模输入。代码实现(C++/Python/Java)直接判断 $n$ 是否为2,分别处理输出。

m0_73659489的博客 92

在没有信用卡的情况下怎么申请谷歌云(Google Cloud)?

这笔额度足够用来跑一台云服务器、部署小型网站,甚至可以尝试 AI、机器学习等项目。但问题来了——想要拿到这 300 美元,你必须先通过支付方式验证。默认选项就是绑定一张国际信用卡(Visa、MasterCard 之类),然而不少人没有信用卡,或者信用卡无法支持国际支付,结果就卡在注册第一步。很多人会疑惑:既然是送额度,为什么还要绑卡?原因其实很简单:谷歌需要确认你是真实用户,而不是批量注册薅羊毛;通过支付验证,后续如果你用完 300 美元额度,可以直接进行付费使用;

m0_74824483的博客 5653

请问一下java在线编程的网站有哪一些?

​ 下面为大家整合了一些Java在线编程的的网站,个人认为都是挺好用的,整合不易,希望大家能顺手留下点赞和收藏! 废话少说,我们直接进入正题: ​

SiKi学院的博客 3万+

激光可燃气体传感器:核心技术环节分析

激光可燃气体传感器核心技术涵盖七个维度:1)TDLAS光谱吸收与调制技术(检测下限ppm级);2)DFB激光器与双闭环温控系统(波长稳定性±0.0036nm);3)微弱信号处理技术(信噪比提升60dB);4)环境补偿算法(温压补偿误差<±1%);5)本质安全防爆设计(ExiaIICT4Ga等级);6)智能边缘计算(STM32L476芯片);7)多重性能验证(响应时间<1秒)。通过微型化、多气体检测等创新,该技术已在工业安全等领域替代传统方案,实现高精度检测。(149字)

上市公司前技术负责人,20 年软硬件深耕 + 百人研发团队管理经验,名校理工科背景加持。从技术攻坚到团队掌舵,沉淀海量项目实战与管理心得,专注分享软硬件干货、疑难问题解决方案,既是靠谱知识传播者,也盼链接优质项目共成长。 1042

Java代码生成器(开源版本)

Java代码生成器,在线代码生成器,Mybatis代码生成器,开源Java代码生成器

欢迎光临 1462

springboot+shardingsphere+druid 实现基于时间的水平分表

使用shardingsphere基于时间字段的动态水平分片。

weixin_42207940的博客 2627

谈谈SAP顾问的几个发展趋势

大家新年好,今天想聊一下对SAP顾问发展趋势的一些个人见解。过去10多年得益于我国的经济发展,外资不断加大在中国的投资和中国企业的发展,SAP顾问行业得到了很大的发展和壮大。那么未来几年SAP顾问的职业发展到底怎么样呢?

syounger的专栏 2513

【编程题】科大讯飞 2018校招 在线笔试题 题解

2018科大讯飞校招在线笔试题题解1.分糖果题目描述:小明和小红是好朋友,但最近遇到一个棘手的问题,有一盒糖果要分成两份,但是每颗糖果质量都不尽相同,但为了分配公平每份糖的糖果数量相差不得超过1,在此条件下两份糖果的质量差距尽可能小。输入:每行包含一个数n,表示糖果数量,后面依次是n个整数依次表示每个糖果的质量,每个糖果的质量都是1之450之间的一个整数,每盒最多有20个糖果。输出:每个样例输出两...

小哲的博客 1501

Landsat9 地表温度反演方法

landsat9地表温度反演及缺失值处理方法

xiangliu12345的博客 3918

判断质数

判断质数_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://www.nowcoder.com/practice/4d2a100c2e544f56ac1ad17e9ffa107d?tpId=220&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=https%3A.

Protinx的博客 379

folium离线地图实战:从下载到部署的完整指南

本文提供了一份完整的folium离线地图实战指南。针对网络不稳定或内网环境下的地图应用需求,详细讲解了如何下载离线地图瓦片数据,并通过两种核心方法(直接替换URL与创建TileLayer)将其集成到folium中。文章还涵盖了部署优化、边界处理及资源本地化等关键步骤,帮助你构建完全脱离网络依赖的交互式地图应用。

weixin_29061041的博客 274

高通SDX35平台 modem启动异常分析

SDX35 MIFI项目在生产时出现modem反复重启问题。经排查发现是modem在初始化GNSS模块时访问了不存在的硬件地址导致崩溃,原因是产线使用的SDX35 000-AB型号芯片阉割了GNSS功能,而本地测试使用的AA型号支持该功能。解决方案是通过修改modem编译选项,采用高通新提供的genlmm2选项(保留IMS和SMS功能但去除GNSS支持),最终解决了启动异常问题并满足VZW认证需求。

四儿家的小祖宗的博客 273

java编程题 有难度的_java在线笔试编程题目,难度一般

原文链接:https://blog..net/qq_42756994/article/details/828015241.题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?第一个月兔子总数:1对第二个月兔子总数:1对第三个月兔子总数:2对第四个月兔子总数:3对第五个月兔子总数:5对发现这是一个斐波拉契...

weixin_36206609的博客 678

Harness Engineering:让Coding Agent真正落地生产

本文将带你系统性地了解如何让Coding Agent真正落地生产,核心是依托(全球领先的持续交付、云成本管理、 feature flagging、安全治理一体化平台),结合企业级AIDD(AI-Driven Development)的工程化实践,构建一套可信赖、可观测、可扩展、可治理的Coding Agent落地体系。核心概念与理论基础:什么是Coding Agent?它和普通的AI代码补全工具(比如GitHub Copilot)有什么区别?什么是Harness Engineering?

移动开发前沿的博客 455

阿里巴巴校招2015——研发在线笔试 20140829

感觉IT企业校招越来越早了,上周末跟朋友打电话,他说阿里

1541

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

中国移动系统集成公司2020春招技术综合在线编程题第一题

求出从3开始到x结束的区间之内的所有质数,然后对这些数字计算平方根之和。

康雨城 1375

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【牛客网】HJ99 自守数、OR86 返回小于 N 的质数个数

作者:一个喜欢猫咪的的程序员专栏:《Leetcode》喜欢的话:世间因为少年的挺身而出,而更加瑰丽。——《人民日报》

一个喜欢猫咪的程序员 1028

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

[2017腾讯校招在线笔试题]

import java.util.ArrayList; import java.util.Scanner; public class Main { public static ArrayList rst = new ArrayList(); public static void main(String[] args) { Scanner in = new Sc

willshine19的专栏 5186

阿里笔试(2023-08-26)差一点AK = =

真的****,面试30多分钟,都回答的挺好的,最后反问了几个问题,但是面试官突然想起来,问我一句能不能先去实习,我说现在研三了,导师抓的确实很紧,然后就挂了#京。Solution1:合并AB,求组合数dfs:/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 *面了1个半,前面1个小时在问项目主要是他不问细节,他问的都是一些很宏观的东西反问我现在的项目系统设计上有什么缺陷,然后抓住其中的一些点开始扩展问“如果在xx情况。Q2. 90% 数组中选k个数,和。

han_xue_feng的博客 243

day03作业

(2017-网易-笔试编程题)-字符串练习 题目描述: 小易喜欢的单词具有以下特性: 1.单词每个字母都是大写字母 2.单词没有连续相等的字母 3.单词没有形如“xyxy”(这里的x,y指的都是字母,并且可以相同)这样的子序列,子序列可能不连续。 例如: 小易不喜欢”ABBA”,因为这里有两个连续的’B’ 小易不喜欢”THETXH”,因为这里包含子

MJ_linux的博客 553
上一篇: Java在线笔试编程(3)---计算回文序列
下一篇: Android 7.0新特性概览
android_cmos
博客等级 码龄12年 177粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值