当前位置: 首页 > 编程日记 > 正文

永成科技C++笔试题

最后几个题有点难度,在这里说一下:


永成科技C++笔试题
2013-11-19


1.将1亿以内的质数存到一个超级大的数组中,用算法如何实现?
使用"筛法"求解1亿以内的质数的程序的思路:
先动态分配1亿个bit(总计12500000字节),用字节中的每一位代表每一个整数,首先将代表奇数的那些bit位置1,也就是代表偶数(合数)的位,接着再进一步从这些奇数位中筛掉合数.
筛掉合数的方法是,先从100000000(1亿)的开方10000范围内的质数i(3,5,7,11,13,17,19,23,29)开始,去找它在1亿内的奇数倍数i*i,i*i+2i,i*i+4i,...,这里
没有i*i+i是因为它可以写成(i+1)i是2的倍数,已经被过滤掉,将代表这些合数的bit位置0,
那么最后剩下的bit为1的那些bit,就是代表质数的,统计出它们的个数就可以了.


这样做的原理是,基于如下的事实:
(1)任意连续的6个数中,就只会测试2个而已,以6n, 6n+1, 6n+2, 6n+3, 6n+4, 6n+5为例,只需测试6n+1和6n+5, 工作量减少到1/3
(2)判断一个数i是否是素数的话,只需要测试2->sqrt(i)之间的质数就可以了
理由如下:
按素数的定义,也就是只有 1 与本身可以整除,所以可以用 2→i-1 去除 i,如果都除不尽,i 就是素数。观点对,但却与上一点一样的笨拙。当 i>2 时,有哪一个数可以被 i-1 除尽的?没有!为什么?如果 i 不是质数,那么 i=a×b,此地 a 与 b 既不是 i 又不是 1;正因为 a>1,a 至少为 2,因此 b 最多也是 i/2 而已,去除 i 的数用不着是 2→i-1,而用 2→i/2 就可以了。不但如此,因为 i=a×b,a 与 b 不能大于 sqrt(i),为什么呢?如果 a>sqrt(i),b>sqrt(i),于是 a×b > sqrt(i)*sqrt(i) = i,因此就都不能整除i了。如果i不是质数,它的因子最大就是 sqrt(i);换言之,用 2→sqrt(i)去检验就行了
但是,用 2→sqrt(i) 去检验也是浪费。就像前面一样,2 除不尽,2 的倍数也除不尽;同理,3 除不尽,3 的倍数也除不尽……最理想的方法就是用质数去除i。
如果只检查 6n+1 和 6n+5 ?不难发现,它们的距离是4、2、4、2……所以,可以先定义一个变量 gab=4,然后 gab=6-gab;
(3)不能用开方而应该用平方
比较是不能用 sqrt(i),因为它不精确。举个例子,i=121,在数学上,sqrt(i) 自然是 11,但计算机里的结果可能是 10.9999999,于是去除的数就是 2、3、5、7,而不含 11,因此 121 就变成质数了。解决这个问题的方法很简单,不要用开方,用平方即可。例如,如果 p*p<=i,则就用 p 去除 i。而且它的效率比开方高。




为此需要先将2,3,5,7,11,13这样的质数先定位到32bit长度的整数内,这个整数的四字节中的每个字节是10101010,将这个质数放到32bit中的唯一一个bit位上面.
最后计算的结果是5761455个素数,而且程序用时9.375秒


下面是一个老外提供的实现代码,但是我们还有比这个更高效的处理:

//Platform: Ubuntu 12.04.3 64bit
//gcc -std=c99 -g primer_demo.c -o primer_demo
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#include <time.h>int count(unsigned int a)  //统计每个整数中的非0位个数,也就是素数的个数(素数没被筛掉,相对应位为1)
{int sum = 0;for (unsigned int x=a; x; x>>=1)  //x不断作右移运算{if (x & 1)  //x与1作与运算sum++;}return sum;
}void sieve(unsigned int* p)  //筛选法求1亿以内素数
{
//    for(int i=2;i<=10000;i++)
//    for (int i=3; i<=10000; i+=2)   //只筛选奇数显然快于原算法for(int istep=4,i=3; i < 10000 ;i+=(istep^0x6))  //进一步优化,%6余1和5时才可能是素数,即只检查交替相隔2和4的数{if (p[i/32] & (1<<i%32))  //第i个整数对应的32位整数序位为i/32,对应无符号整数的第i%32位,该语句判断p[i]是否为1{  //上面的1<<i%32中,%的优先级高,所以先算出i在无符号整数中在哪一位,然后将1左移这么多位
//          for (int j=i*i; j<100000000; j+=i)for(int j=i*i ;  j<100000000; j+=i*2)   //改进版,每次跳跃检查,j+i已经被2筛除了,每次应检查j+2*i{p[j/32] &= ~(1<<j%32);  //第j个整数置为合数,即是将相应位置0}}}
}int main()
{clock_t start = clock();unsigned int* p = (unsigned int*) malloc(12500000);  //向堆空间申请一亿位(12500000字节*8)if (!p){printf("Not enough memory.\n");return 1;}
//    memset(p,255,12500000);  //将一亿位全置为1(无符号整数为255)memset(p,170,12500000);     //将一亿位中的奇数位索引全置为1(索引从0开始,无符号整数为170)sieve(p);  //对应非素数位全清0int num = 0;   //  整数1对应位置为1,整数2对应位置为0,正好计数的时候抵消了,所以NUM初始化为0。for (int i=0; i<12500000/4; i++){num += count(p[i]);}free(p);printf("within 100,000,000 primers total counter:%d, total time was %7.3f in second\n",num,(double)(clock()-start)/CLOCKS_PER_SEC);return 0;
}





2.二叉树求值?
要求使用递归和循环这两种方法实现.


3.设计简单的文本编辑器,写出架构设计及思路?

相关文章:

事务库事务隔离级别

为了快速同步数据的需要&#xff0c;我分段执行了两次python脚本&#xff0c;即开启了两个进程同步数据&#xff0c;结果服务器不时报出数据库死锁异常&#xff0c;通过排查代码和数据库日志发现&#xff0c;是由长事务并发引起的。代码中有入账和出账两个方法&#xff0c;里面…

十大算法,描述+代码+演示+分析+改进(赶紧收藏!)

十大算法 1.冒泡排序 ​ &#xff08;1&#xff09;算法描述 ​ 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是…

webkit入门准备

《webkit入门准备》1. Ca) Webkit代码风格b) Inlinec) Constd) 构造与析构e) 重载f) 继承2. 泛式编程a) Vector/List/HashTableb) Iteratorc) 智能指针3. 面向对象编程a) 对象概念b) …

oracle操作

一、导入dmp文件&#xff1a; 1.创建表空间create tablespace 表空间 datafile 路径\文件名.dbf size 1500M autoextend on next 5M maxsize 3000M;注&#xff1a;路径必须为已创建2.创建用户create user 用户名 identified by 密码 default tablespace 表空间;3.更改用户的表空…

一个form表单,多个提交按钮(实现不同功能和地址的提交)

直接上代码 表单部分&#xff1a; <form action"" name"find" method"post" enctype"multipart/form-data"><input type"text" name"name"/><br/><button οnclick"f1()"/>找…

chrome 硬件渲染(GPU Accelerated Compositing in Chrome)

原文链接 http://www.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome chrome 中集成了webkit,这篇文章对webkit 硬件渲染过程有详细的介绍&#xff0c;很好。 简介 这篇文档讲解chrome硬件加速合成的实现细节和背景。 介绍 通常来讲&#…

CCS Font 知识整理总结

总是搞不懂 CCS 中如何正确的使用字体&#xff0c;这下明白了。 1、什么是 font-face font-face 顾名思义&#xff0c;就是文字的脸。字体是文字的外在形式&#xff0c;就是文字的风格&#xff0c;是文字的外衣。比如行书、楷书、草书&#xff0c;都是一种字体。同样一个字每个…

Maven安装与配置(最实用!!!)eclipse中配置maven

Maven安装与配置 一、需要准备的东西 JDKEclipse&#xff08;本章主要是在eclipse中进行配置maven&#xff09;Maven程序包 二、下载与安装 1. 前往maven下载最新版的Maven程序&#xff1a; 2. 将文件解压到D:\Program Files\Apache\maven目录下&#xff08;这样子放目录结…

在Ubuntu 12.04 64bit上配置,安装和运行go程序

注意:下面的安装配置均遵从官网或是教材《Go语言程序设计》中的部分内容. 顺便说下&#xff0c;这是一本很难得的Go语言的入门教程&#xff0c;非常基础和全面。起初我因为这本书的封面比较讨厌它&#xff0c;闲置几年之后&#xff0c;一次偶尔要用时静心翻阅之后&#xff0c;发…

Linux下三个密码生成工具

http://code.csdn.net/news/2820879 想出一个难破解且容易记的密码对不是一件简单的事情。在我为电脑设定一个新密码&#xff0c;或者在线注册了一个新的账号&#xff0c;需要输入密码的时候&#xff0c;脑袋就一片空白。不过&#xff0c;Linux下有几个密码生成工具可以使用&am…

javabean实体类与实体类之间的快速转换

一、Dozer是什么&#xff1f; dozer是一个能把实体和实体之间进行转换的工具.只要建立好映射关系.就像是ORM的数据库和实体映射一样. 使用方法示例如下: // article(PO) -> articleVOArticleVO articleVO dozerMapper.map(article, ArticleVO.class);这段示例代码。将从数…

ATS程序功能和使用方法详解

转载自https://blog.zymlinux.net/index.php/archives/374 Apache Traffic Server的程序文件&#xff0c;与传统的服务器系统有大不同&#xff0c;这里我们将会对这些文件进行详细的解读&#xff0c;并尽可能的对程序的功能和基本用法、参数等进一步说明&#xff0c;以利于新入…

java 读取txt,java读取大文件

java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File;import java.io.RandomAccessFile;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel; public class Test { public static void main(String[] args) throws Exception …

Spring Boot整合Spring Data JPA操作数据

一、 Sping Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套 JPA 应用框架&#xff0c;底层使用了 Hibernate 的 JPA 技术实现&#xff0c;可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能&…

常用Linux命令总结

常用Linux命令总结 2013-12-08 压缩为gz格式 gzip error_2018082217.log 解压gz格式 gzip -d error_2018082217.log.gz 不解压来搜索gz格式的文件中的匹配行内容 gunzip -c 不真正解压.gz文件&#xff0c;而是检查该文件&#xff0c;不会生成多余的文件 gunzip -c error_20…

调试uIP出现死机问题

在调试uIP&#xff0c;加入http功能时&#xff0c;调试出现死循环 原因是所加入的http文件中含有printf等输出函数&#xff0c;遇到这种情况&#xff0c;有2种解决方法&#xff1a; 1.Keil中勾选“Use MicroLIB” 2. //加入以下代码&#xff0c;支持printf函数&#xff0c;而…

html+spring boot简单的ajax数据传输实现

本篇讲解在前后端不分离情况下的htmlspring boot的项目数据传输实现 首先&#xff0c;后台我写了三个接口 package com.demo.ajax.controller;import com.demo.ajax.Entity.Person; import lombok.extern.slf4j.Slf4j; import org.jboss.logging.Param; import org.springfram…

Tafficserver旁路接入方案综述

转载自 https://blog.zymlinux.net/index.php/archives/821 随着宽带技术的加速普及&#xff0c;目前&#xff0c;几款高性能开源CDN方案在广大开源爱好团队的充分的测试、企业服务应用验证中破壳而出。实际这个地球的互联网用户都在知情与不知情之间使用了ATS的环保服务。这方…

url中去掉index.php,方便redirect()

01 配置文件 return Array( URL_MODEL > 2,); 02 index.php入口文件下面加入文件 .htaccess -->使用editplus-->另存为 <IfModule mod_rewrite.c>RewriteEngine onRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ i…

js校验复选框(多选按钮)是否被选中的方法

js校验复选框是否被选中的方法 方法一&#xff1a;&#xff08;使用下标进行标记&#xff09; if ($("#checkbox-id")get(0).checked) {// do something }方法二&#xff1a;&#xff08;对被选中的进行操作&#xff09; if($(#checkbox-id).is(:checked)) {// do…

ATS插件开发基础

转载自 https://blog.zymlinux.net/index.php/archives/540 ATS插件开发需要提前了解ATS的插件的一些设计思想&#xff0c;以及系统提供的一些不同方向。我们将会介绍ATS的基础开发知识&#xff0c;以利于后续的插件开发课程讲解。 ATS的SDK文档&#xff0c;是了解ATS的核心设…

NET基础(3):is 和 as 操作符

在C#语言中进行类型转换的另外一种方式是使用is和as操作符。is检查对象是否兼容于指定类型&#xff0c;返回Boolean值true或false。注意&#xff0c;is操作符永远不抛出异常&#xff0c;例如以下代码&#xff1a; Object o new Object();Boolean b1 (o is Object); //返回…

制作大白菜PE盘

大白菜是一款功能非常强大的U盘启动盘制作工具&#xff0c;通过大白菜我们可以把U盘做成可以引导电脑启动的启动盘&#xff0c;同时可以用于装系统或维护系统&#xff0c;虽然制作方法非常简单&#xff0c;不过还是有很多人不懂如何制作大白菜U盘启动盘&#xff0c;这两天我刚好…

为方便ATS管理建立的一些命令别名

转载自https://blog.zymlinux.net/index.php/archives/129 玩ats经常需要切换目录什么感觉敲得麻烦了就建立了一些命令别名&#xff0c;就方便多了。 在用户目录下的.bashrc文件中加入以下内容&#xff1a; alias alogcd /usr/local/var/log/trafficserver;pwd alias atscd /us…

short s1 = 1; s1 = s1 + 1;有错而short s1 = 1; s1 += 1正确

这个问题以前碰到过&#xff0c;也研究过&#xff0c;发表一下&#xff1a; 如果你认为表达式&#xff08;x i&#xff09;只是表达式&#xff08;x x i&#xff09;的简写方式&#xff0c;这并不准确。这两个表达式都被称为赋值表达式。第二个表达式使用的是简单赋值操作…

pom文件中引入常用的maven仓库

给大家分享几个maven仓库&#xff0c;如果本地总是下载很慢的话可以尝试换一下仓库或者多加几个。可以直接拖放在pom.xml中使用。 阿里云仓库 <mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.ali…

ats新手学习参考

转载自https://blog.zymlinux.net/index.php/archives/129 首先申明本人是个实实在在的菜鸟&#xff0c;现在也只是搭建起来ats玩玩简单的&#xff0c;写本文只是为了给完全的小白一个参考而已。 本人刚开始接触ats的时候&#xff0c;从ats安装到配置也遇到了很多基本的问题&am…

[svc]磁盘接口与RAID

一 磁盘接口 IDE 传统家用: /dev/hda1 SISC 传统服务器: /dev/sdb1 SATA 现在家用 SAS 现在服务器用 FC(光纤通道) 高级服务器 注意: 分区编号,1-4只能给主分区或扩展分区使用,逻辑分区是基于扩展分区来搞的,编号从5开始. MBR分区参考 现在计算机性能瓶颈往往在硬盘: …

条形码?二维码?生成、解析都在这里!

二维码生成与解析 一、生成二维码 二、解析二维码 三、生成一维码 四、全部的代码 五、pom依赖 直接上代码&#xff1a; 一、生成二维码 public class demo {private static final String path1"D:\\code.jpg";private static void qr(String text,int width,int w…

异步预热在线视频实现

转载自https://blog.zymlinux.net/index.php/archives/100 毕业之际给学校搭建了基于ATS的正向代理缓存服务器&#xff0c;专门用来处理优酷土豆等在线视频流量。通过改写一个浏览器做成在线视频专用浏览器&#xff0c;内置了ATS的代理设置。 用php配合memcacheq和小脚本实现了…