「考研算法」

2023-11-13

考研算法

前言

本系列文章涉及的算法内容,针对的是哈尔滨工业大学854科目。在本文中通过具体的算法题进行讲解相应算法。

今天涉及的算法主要有线性筛,十大排序中快速排序和归并排序。(C语言版)


一、线性筛算法

算法题目:筛质数

给定一个正整数 n,请你求出 1∼n中质数的个数。
输入格式

共一行,包含整数 n。

输出格式

共一行,包含一个整数,表示 1∼n中质数的个数。

数据范围

1 ≤ n ≤ 10^6

输入样例:
8
输出样例:
4

算法思路:

  1. 切记1不是质数
  2. 核心:把某一个合数用它的质因数进行筛走。

我们常见的筛法有:朴素筛法(O(LogN * N)),埃式筛法(O(N*log(logN)),线性筛法(O(N))。本文中选择时间复杂度最好的线性筛法。

算法代码:

#include <stdio.h>
#include <stdbool.h>
#define N  1000005
bool st[N];
int primes[N];
int cnt;
void getPrimes(int n){
    for(int i = 2; i <= n; ++i){
        if(!st[i]){
            primes[cnt++] = i;//把质数添加进去
        }
        //for循环每次进行从0开始到primes[j] * i ~ n,最大到n
        for(int j = 0; primes[j] <= n / i; ++j){
            st[primes[j] * i] = true;
            if(i % primes[j] == 0){
                break;
            }
        }
        // 1. 如果 i % primes[j] == 0, 说明primes[j]是i的最小质因子,primes[j]一定是primes[j] * i  的最小质因子。
        // 2. 如果 i % primes[j] != 0, 说明primes[j]一定小于i的所有质因子,primes[j]一定是primes[j] * i 的最小质因子。
    }
}
int main(){
    int n;
    scanf("%d", &n);
    getPrimes(n);
    printf("%d\n", cnt);
    return 0;
}


今天的算法除了线性筛比较难点,剩下的排序算法都很简单,直接上代码,不再进行注释。


二、快速排序

算法题目: 快速排序

给定你一个长度为 n的整数数列。

请你使用快速排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行包含整数 n。

第二行包含 n个整数(所有整数均在 1∼10^9 范围内),表示整个数列。

输出格式

输出共一行,包含 n个整数,表示排好序的数列。

数据范围

1≤n≤100000

输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5

算法代码:

C版本
#include<stdio.h>

#define N 1000005
int a[N];
void swap(int i,int j){
    int a1 = a[i];
    a[i] = a[j];
    a[j] = a1;
}
void  quick_sort(int l,int r)
{
    if(l>=r) return ;
    int i=l-1,j=r+1,x=a[l+r>>1];
    while(i<j)
    {
        do i++;while(a[i]<x);
        do j--;while(a[j]>x);
        if(i<j) swap(i,j);
    }
    quick_sort(l,j);
    quick_sort(j+1,r);
}
int main()
{
    int n;
    scanf("%d", &n);
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    quick_sort(0,n-1);
    for(int i=0;i<n;i++) printf("%d ",a[i]);
    return 0;
}

三、归并排序

注:由归并排序衍生出的小和问题,逆序对的数量的问题,后边会进行一一讲解。
算法题目:归并排序

给定你一个长度为 n的整数数列。

请你使用快速排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行包含整数 n。

第二行包含 n个整数(所有整数均在 1∼10^9 范围内),表示整个数列。

输出格式

输出共一行,包含 n个整数,表示排好序的数列。

数据范围

1≤n≤100000

输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5

算法代码:

C版本
#include <stdio.h>
void merge_sort(int a[], int l, int r){
    if(l >= r){
        return;
    }
    int mid = l + ((r - l) >> 1);
    merge_sort(a, l, mid);
    merge_sort(a, mid + 1, r);
    int help[r - l + 1];
    int i = 0;
    int p1 = l;
    int p2 = mid + 1;
    while(p1 <= mid && p2 <= r){
        help[i++] = a[p1] < a[p2] ? a[p1++] : a[p2++];
    }
    while(p1 <= mid){
        help[i++] = a[p1++];
    }
    while(p2 <= r){
        help[i++] = a[p2++];
    }
    for(p1 = l, p2 = 0; p1 <= r; p1++, p2++){
        a[p1] = help[p2];
    }
}
int main(){
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i = 0; i < n; i++){
        scanf("%d",&a[i]);
    }
    merge_sort(a, 0, n - 1);
    for(int i = 0; i < n; i++){
        printf("%d ", a[i]);
    }
    return 0;
}

最后介绍一个有意思的算法:高精度阶乘

算法题目: 高精度阶乘

随意输入一个n,要求返回n的阶乘。

一、代码如下:
#include <stdio.h>
int main()
{
    long ans[1000100];
    long n;
    scanf("%lld", &n);
    ans[0] = 1;

    int l = 0;
    long num = 0;
    for(int i = 1; i<=n;++i)
    {
        num = 0;
        for(int j = 0; j <= l; j++)
        {
            num = num + ans[j] * i;
            ans[j] = num % 10;
            num /= 10;
        }
        while(num != 0)
        {
            ans[++l] =num % 10;
            num /= 10;
        }
    }
    for(int i = l; i >= 0; --i)
    {
        printf("%d",ans[i]);
    }
    return 0;
}

代码解析:
	我们接下来把n设置为4,进行代码的实例演示以及解析
	{
		long[] ans = new long[10001000];//定义答案数组
		n = 4;//设置指定数字为4
		ans[0] = 1;	//将答案数组的第一位设置为1
	    int l = 0;//定义变量l,用来记录n!的数字有多少位
	    long num = 0;//定义变量num
	    for(int i = 1; i<=n;++i)//核心代码,将在下边进行实例解析
	    {
	        num = 0;
            for(int j = 0; j <= l; j++)
            {
                num = num + ans[j] * i;
                ans[j] = num % 10;
                num /= 10;
            }
            while(num != 0)
            {
                ans[++l] =num % 10;
                num /= 10;
            }	   
       }
       
       
       {
       		当i == 1时,j == 0, j <= l (0 <= 0), num = 0;
       			num = num + ans[0] * i = 0 + 1 * 1 = 1;
       			ans[0] = num % 10 = 1 % 10 = 1;
       			num = num / 10 = 1 / 10 = 0;
       			
       		当i == 2时,j == 0,j <= l (0 <= 0),num = 0;
       			num = num + ans[0] * i = 0 + 1 * 2 = 2;
       			ans[0] = num % 10 = 2 % 10 = 2;
       			num = num / 10 = 2 / 10 = 0;
       			
       		当i == 3时,j == 0,j <= l (0 <= 0),num = 0;
       			num = num + ans[0] * i = 0 + 2 * 3 = 6;
       			ans[0] = num % 10 = 6 % 10 = 6;
       			num = num / 10 = 6 / 10 = 0;
       			
       		当i == 4时,j == 0,j <= l (0 <= 0),num = 0;
       			num = num + ans[0] * i = 0 + 6 * 4 = 24;
       			ans[0] = num % 10 = 24 % 10 = 4;
       			num = num / 10 = 24 / 10 = 2;
       			进入while循环,
       				num = 2 != 0;
       				ans[++l] = num % 10 = 2 % 10 = 2;(此时l == 1);
       				ans[1] = 2;
       				num = num / 10 = 2 / 10 = 0;
       		
       		当i == 5时,j == 0,j <= l (0 <= 1),num = 0;
       			num = num + ans[0] * i = 0 + 4 * 5 = 20;
       			ans[0] = num % 10 = 20 % 10 = 0;
       			num = num / 10 = 2;
       		当i == 5时,j == 1,j <= l (1 <= 1),num = 2;
       			num = num + ans[1] * i = 2 + 2 * 5 = 12;
       			ans[1] = num % 10 = 12 % 10 = 2;
       			num = num / 10 = 12 / 10 = 1;
       			进入while循环,
       				num = 1 != 0;
       				ans[++l] = num % 10 = 1 % 10 = 1;(此时l == 2);
       				ans[2] = 1;
       				num = num / 10 = 0;
       		结束。
       }
	}
	
代码测试:

1.n = 1000

在这里插入图片描述

1000! = 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

计算时间是非常快的,大家可以对照这个链接下的1000!,来看看程序是否算对了,我大致看了下,没有问题。

链接如下:https://www.haomeili.net/JieCheng?JieCheng=1000

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

「考研算法」 的相关文章

  • 华为OD机试 - 用连续自然数之和来表达整数(Java)

    题目描述 一个整数可以由连续的自然数之和来表示 给定一个整数 计算该整数有几种连续自然数之和的表达式 且打印出每种表达式 输入描述 一个目标整数T 1 lt T lt 1000 输出描述 该整数的所有表达式和表达式的个数 如果有多种表达式

随机推荐

  • 【vue3+elementplus】el-table的操作列使用子组件渲染按钮,按钮权限改变,父给子传值,子组件的dom不更新的解决方案

    起初是因为我使用了这个回答里面的组件去渲染表格操作列 需求 点击某个按钮 表格数据改变 按钮的权限也随着该数据变化而变化 问题 表格行数据变了 给子组件传的值也变了 在watch中也监听了 但是子组件的dom就是不更新 原因 重新获取表格数
  • 单键控制单片机电源开关电路

    原文地址 http www jichudianlu com archives 168 相关文章 1 问答 单片机控制电源开关 https bbs elecfans com jishu 1698980 1 1 html 2 由MCU控制的开关
  • 野火 RT1052 移植网卡功能(LAN8720A)

    野火 RT1052 移植网卡功能 LAN8720A 开发环境 RT Thread v4 0 2 master SOC i MX RT1050 Board 野火 RT1052 目的 在 RT Thread 系统上进行网络通讯 背景描述 1 首
  • 一维随机变量的常见分布、期望、方差及其性质与推导过程

    文章目录 必须知道的概率论知识 一维变量 离散随机变量 def 常见分布 几何分布 期望 方差 二项分布 b n p 期望 方差 泊松分布 P
  • 小小圣诞树来了

    作者 小刘在这里 每天分享云计算网络运维课堂笔记 疫情之下 你我素未谋面 但你一定要平平安安 一 起努力 共赴美好人生 夕阳下 是最美的 绽放 愿所有的美好 再疫情结束后如约而至 目录 圣诞树 一 代码 圣诞树 一 代码 import tu
  • postgres之jsonb属性的简单操作

    jsonb的一些简单操作 增删改查 更新操作 attributes属性为jsonb类型 方法定义 jsonb set target jsonb path text new value jsonb create missing boolean
  • MySql 笔记

    数据结构 B TREE 二叉树 顺序增长依次查询效率低 红黑树 数据多了深度越深 效率自然低了 HASH 查询条件限制 B TREE 度 degree 节段的数据存储个数 叶节点具有 相同的深度 叶节点的指针为空 节点的数据key从左到右递
  • vue3 多种方法的锚点定位

    在 Vue 3 中 可以通过多种方式实现锚点定位 包括使用原生的 JavaScript 方法和利用 Vue Router 提供的导航守卫等 下面我会分别介绍这些方法 1 使用原生 JavaScript 方法 在 Vue 3 中 你可以使用
  • 【Hadoop生态圈】7.离线OLAP引擎Hive入门教程

    文章目录 1 简介 2 架构分析 3 环境准备 4 使用客户端工具操作hive 4 1 数据库操作 4 2 DDL操作 4 2 1 创建表 4 2 2 导入数据到hive表中 4 2 3 指定列和行分隔符创建表 4 2 4 数据类型 4 3
  • [已解决]jeesite生成页面的弹窗问题

    jeesite生成的页面如需弹窗layer写法会有问题 actions push a href class btnList title i class fa fa check i a nbsp data confirm text 提示信息
  • ansible安装nginx

    ansible安装nginx 定义一个ansible组 把nginx tar包传到ansible主机 ansible 组名 m shell a yum y install pcre devel open devel gcc gcc c ng
  • Golang 单元测试详尽指引

    文末有彩蛋 作者 yukkizhang 腾讯 CSIG 专项技术测试工程师 本篇文章站在测试的角度 旨在给行业平台乃至其他团队的开发同学 进行一定程度的单元测试指引 让其能够快速的明确单元测试的方式方法 本文主要从单元测试出发 对Golan
  • IntelliJ IDEA 进行js Debug调试

    idea的js调试目前看来不同给力 一是玩转它需要安装谷歌插件支持 二是貌似存在一些bug 一 新建一个jsp并打上断点 二 调试 idea出现提示 安装JetBrains IDE Support支持 问题出现了 点击其中连接却一直连不上
  • [其他]IDEA中Maven项目配置国内源

    配置国内源主要解决了 在maven项目中pom xml下载jar包失败或过慢的问题 在IDEA中的设置分成两种 设置当前项目与新创项目 我们就需要两种都进行设置 不然只有在当前项目配置了国内源 新创项目的时候还是默认的状态 由于下面两种设置
  • 有监督对比loss计算

    https blog csdn net wf19971210 article details 116715880 关于对比损失 无监督对比损失 通常视数据增强后的图像与原图像互为正例 而对于有监督对比损失来说 可以将同一batch中标签相同
  • 均值计算的R语言实现

    均值计算的R语言实现 在数据分析和统计学中 均值是一个常用的指标 用于描述数据集的集中趋势 在R语言中 我们可以使用多种方法来计算均值 下面将介绍几种常见的方法 并提供相应的R代码示例 使用mean 函数计算均值 mean 函数是R语言中用
  • Scratch的克隆体

    克隆体 克隆就是将角色本体完全复制一份 包含该角色当前的所有属性 例如造型 位置 颜色 大小等 控制积木中提供了克隆自己积木 在事件积木中 单独提供了一个当作为克隆体启动时的积木 当某个角色被克隆 则其克隆体会触发该事件 故而 对于那些克隆
  • 第十课,OpenGL光照之贴图

    光照贴图 光照贴图 及使用纹理代替物体颜色 物体的实际颜色由物体材质和光照决定 漫反射贴图 使用一张覆盖物体的图像 让我们能够逐片段索引其独立的颜色值 方式 1 将纹理传入 GLuint texture1 loadTexture conta
  • 在 CentOs7 中安装宝塔面板和 Docker(包括MySQL,Redis)

    在 CentOs7 中安装宝塔面板和Docker 包括MySQL Redis 1 使用 Xshell 连接 CentOs7 2 安装宝塔面板 2 1 安装 Tomcat 同 Java 8 2 1 安装 Docker 2 2 安装 MySQL
  • 「考研算法」

    考研算法 前言 本系列文章涉及的算法内容 针对的是哈尔滨工业大学854科目 在本文中通过具体的算法题进行讲解相应算法 今天涉及的算法主要有线性筛 十大排序中快速排序和归并排序 C语言版 一 线性筛算法 算法题目 筛质数 给定一个正整数 n