【马蹄集】—— 数论专题:筛法

news2024/12/23 11:08:31

数论专题



目录

  • MT2213 质数率
  • MT2214 元素共鸣
  • MT2215 小码哥的喜欢数
  • MT2216 数的自我
  • MT2217 数字游戏




MT2213 质数率

难度:黄金    时间限制:1秒    占用内存:256M
题目描述

请求出 [ 1 , n ] \left[1,n\right] [1,n] 范围内质数占比率。

格式

输入格式:一样一个整数 n n n,含义如题描述。。
输出格式:输出 [ 1 , n ] \left[1,n\right] [1,n] 范围内的质数占比,保留 3 位小数。

样例 1

输入:
10

输出:
0.400

备注

对于 100% 的数据: 1 ≤ n ≤ 1 0 8 1\le n \le 10^8 1n108


相关知识点:筛法


题解


题目的要求很简单,本质就是求指定区间内的质数。最常规的做法就是暴力枚举:对区间 [ 1 , n ] \left[1,n\right] [1,n] 内的每个数进行判断,统计其是否为质数。即:

// 判断一个数是否为质数 
bool isPrime(int n)
{
    int limit = sqrt(n);
    for(int i=2; i<=limit; i++)
        if(n%i == 0)
            return false;
    return true;
} 

// 统计区间 1-n 内的质数个数 
int getPrimes(int n)
{
    int ans = 0;
    for(int i=2; i<=n; i++)
        if(isPrime(i))
            ans++;
    return ans;
}

其中,判断一个数 n n n 是否为质数的时间复杂度为 O ( n ) O\left(\sqrt n\right) O(n ),统计 n n n 个数中的质数个数的时间复杂度则为 O ( n 3 2 ) O\left(n^\frac{3}{2}\right) O(n23) ,这在 1 ≤ n ≤ 10 8 1\le n\le{10}^8 1n108 的数据范围下必定超时。同时,从数据范围看,实际上已经暗示了必须在线性时间复杂度内完成求解。因此,不得不用到筛法。筛法的主要思想是:对已经找出的质数,直接将其倍数从接下来的查找中筛出,而不必再去判断那些数是否为质数,从而节省时间。根据筛法的停止策略,主要可将其分为两类:

  • 埃式筛法;
  • 欧拉筛法。

下面分别对其进行分析。


埃拉托斯色尼筛选法

若要得到自然数 n n n 以内的全部质数,必须把不大于 n \sqrt n n 的所有质数的倍数剔除,则剩余数均为质数。例如,若要得到 [ 1 , 100 ] \left[1,100\right] [1,100] 范围内的全部质数,其求解步骤如下:

  • n n n 开方得到 100 = 10 \sqrt{100}=10 100 =10
  • [ 1 , 10 ] \left[1,10\right] [1,10] 内的全部质数,即 2、3、5、7;
  • [ 1 , 100 ] \left[1,100\right] [1,100] 将 2、3、5、7 的倍数全部剔除。

剩下的数均为质数。

埃式筛法的特点是简单易懂,其时间复杂度为 O ( n log ⁡ log ⁡ n ) O\left(n\log{\log{n}}\right) O(nloglogn),从上面的描述可直接得到其对应代码为:

const int MAX = 1e8+5;
bool vis[MAX];
int prime[MAX], cnt;

// 埃式筛法统计区间质数
int sieveByElatoseni(int n)
{
    int limit = sqrt(n);
    for(int i=2; i<=limit; i++){
        // 若存在某个数尚未被访问,则其为质数 
        if(!vis[i]) prime[cnt++] = i;
        // 将这个数的倍数全部置为已被访问
        for(int j=i*2; j<=n; j+=i) 
            vis[j] = true;
    }
	// 剩余尚未被访问的数均为质数
    for(int i=limit+1; i<=n; i++)
         if(!vis[i]) prime[cnt++] = i;
    return cnt;
}

欧拉筛选法

注意到在埃式筛法过程中,存在相当一部分重复筛除工作。例如,当确定 2 为质数时,后续会将其倍数:4、6、8、10、12、……全部筛除。而接下来当确定 3 为质数时,后续会将 6、9、12、……全部筛除。这时,所有以 2×3=6 为因数的数,如 6、12、18、24、……等都会被重复纳入筛除进程中,这无疑浪费了相当一部分计算资源。

因此,出现了一种更节约时间的筛法——欧拉筛法(线性筛法)。欧拉筛法的整体思路和埃式筛法相似,都是通过将已得到质数的倍数从数据集中筛除来减少判断时间。不过为了让某个数只执行一次筛除操作,欧拉筛法规定一个数只能被其最小的质因数给筛掉。例如,对 12 而言,质数 2 和 3 都能将其筛掉,但是欧拉筛法的执行过程中,只会让 12 在面对质数 2 时被筛除,而不再被 3 筛去。

为了实现 “合数只被其最小质因数筛除一次”,欧拉筛法不再遍历已确定质数的全部倍数,而是遍历已得到的全部质数,并在遍历过程中加入对当前乘数是否为质数的判断,以实现提前停止策略。正是这个提前停止策略,使得欧拉筛法具有线性复杂度。这个过程的详细步骤如下(对自然数从小到大枚举(从 2 开始)):

  1. 对当前数 i i i,如果其尚未被访问,则其必为质数,故将其加入质数队列;
  2. 枚举已记录的质数:
    • 将当前质数与 i i i 相乘,其乘积得到的数必为合数,标记该数为已被访问;
    • 判断 i i i 是否为质数。如果 i i i 是质数,则继续枚举质数队列中的数进行筛选;如果 i i i 是合数(即 i i i 存在某个约数,假设该约数为 p p p),则说明由当前质数与 i i i 相乘得到数有可能会在后续被其他更大的以 p p p 为约数的数筛掉,而欧拉筛法规定 “合数只被其最小质因数筛除一次”。由于我们的枚举过程是从小到大进行的,因此第一次筛掉某个数时,其总数满足欧拉筛法的要求的。因此,为了避免后续再对以 p p p 为最小质因数的数进行重复筛选,在此就必须强制退出当前循环。

循环结束。

这便是欧拉筛法的执行步骤,它对每个数的筛选都仅进行一次,故其时间复杂度为 O ( n ) O\left(n\right) O(n)。下面给出代码:

const int MAX = 1e8+5;
bool vis[MAX];
int prime[MAX], cnt;

// 欧拉筛法统计区间质数
int sieveByEuler(int n)
{
    // 遍历全部数 
    for(int i=2; i<=n; i++){
        // 如果当前数未被访问,则其为一个质数 
        if(!vis[i]) prime[cnt++] = i;
        // 枚举已记录的质数:该质数的整倍数都不可能是质数
        for(int j = 0; prime[j]*i<=n; j++){
            // 将合数置为被访问 
            vis[prime[j]*i] = true;
            // 下面的代码是精髓:每次筛除合数时,选择恰当的时机及时中断,避免后面重复筛选
            // 如果 i 是质数,则继续对已选出的质数进行筛选 
            // 如果 i 是合数,则后续会出现重复筛选,故强制中断 
            if(i % prime[j] == 0) break;
        } 
    }
    return cnt;
}

下面通过一个实际例子来模拟欧拉筛法的具体执行流程,假设现在取 n = 25 n=25 n=25

在这里插入图片描述

从 “选出的质数” 和 “标记被访问(不是质数)” 两列看,欧拉筛法处理的数字并没有出现任何重复。这也就是说,对 [ 1 , n ] \left[1,n\right] [1,n] 内的任何数,欧拉筛法都只会判断一次,因此也称欧拉筛法为线性筛法。

回到本题,可基于欧拉筛法求出 [ 1 , n ] \left[1,n\right] [1,n] 内的全部质数,并将其与区间长度求商即可,下面给出完整代码:

/*
    MT2213 质数率
    欧拉筛法
*/
#include<bits/stdc++.h> 
using namespace std;

const int MAX = 1e8+5;
bool vis[MAX];
int prime[MAX], cnt; 

// 求 1-n 中的质数个数 
int getPrime(int n)
{
    // 从 2 开始向后查找质数 
    for(int i=2; i<=n; i++){
        // 如果当前数未被访问,则其为一个质数 
        if(!vis[i]) prime[cnt++] = i;
        // 枚举已记录的质数:该质数的整倍数都不可能是质数
        for(int j = 0; prime[j]*i<=n; j++){
            // 将合数置为被访问 
            vis[prime[j]*i] = true;
            // 下面的代码是精髓:每次划掉合数时选择恰当的时机中断,避免后面重复划掉合数,提高算法效率 
            // 如果 i 是质数,则最多枚举到自身中断
            // 如果 i 是合数,则最多枚举到自身的最小质数中断 
            if(i % prime[j] == 0) break;
        } 
    }
    return cnt;
}

int main()
{
    // 获取输入 
    int n; cin>>n;
    // 输出质数率 
    printf("%.3f",(double)getPrime(n)/n);
    return 0;
} 



MT2214 元素共鸣

难度:黄金    时间限制:1秒    占用内存:128M
题目描述

遥远的大陆上存在着元素共鸣的机制。
建立一个一维坐标系,其中只有素数对应的点的坐标存在着元素力,而相距为 k k k 的两个元素力之间能形成元素共鸣。现在,需要求出 n n n 范围内所有能元素共鸣的点对,并将他们以第一个点的坐标大小为关键字排序后输出(小的在前)。

格式

输入格式:一行两个整数 n , k n,k n,k
输出格式:所有小于等于 n n n 的素数对。每对素数对输出一行,中间用单个空格隔开。
     若没有找到任何素数对,输出empty。

样例 1

输入:

6924 809

输出:

2 811

备注

其中: 1 ≤ k ≤ n ≤ 10 4 1\le k\le n\le{10}^4 1kn104


相关知识点:筛法


题解


方法二:暴力求解

本题实际就是求 “具有指定差距 k k k 的质数对”,在 10 4 {10}^4 104 范围下如果按暴力方式逐个求解,也是可以通过的:

/*
    MT2214 元素共鸣 
    暴力枚举
*/
#include<bits/stdc++.h> 
using namespace std;

// 判断一个数是否为质数 
bool isPrime(int n)
{
    int limit = sqrt(n);
    for(int i=2; i<=limit; i++)
        if(n%i == 0)
            return false;
    return true;
} 

int main( )
{
    // 获取输入 
    int n, k, tmp; cin>>n>>k;
    // 查找产生共鸣的元素 
    bool flag = false;
    for(int i=2; i<n; i++) {
        // 如果当前数为质数,则进一步判断目标数是否也为质数 
        if(isPrime(i)){
            // 目标数 
            tmp = i + k;
            // 不能超过数据范围,且必须是质数 
            if(tmp<=n && isPrime(tmp)){
                flag = true;
                cout<<i<<" "<<tmp<<endl;
            }
        }
    }
    if(!flag) cout<<"empty"<<endl;
    return 0;
} 

方法二:筛法求解

也可以利用筛法,提前算出所有的质数,然后再在质数里枚举能产生共鸣的元素:

/*
    MT2214 元素共鸣 
    欧拉筛法
*/
#include<bits/stdc++.h> 
using namespace std;

const int MAX = 1e4+5;
bool vis[MAX];
int prime[MAX], cnt; 

int getPrime(int n)
{
    for(int i=2; i<=n; i++){
        if(!vis[i]) prime[cnt++] = i;
        for(int j = 0; prime[j]*i<=n; j++){
            vis[prime[j]*i] = true;
            if(i % prime[j] == 0) break;
        } 
    }
    return cnt;
}

int main( )
{
    // 获取输入 
    int n, k, tmp; cin>>n>>k;
    // 获取全部的质数
    getPrime(n);
    // 查找产生共鸣的元素 
    bool flag = false;
    for(int i=0; i<cnt-1; i++) {
        // 目标数 
        tmp = prime[i] + k;
        // 不能超过数据范围,且必须是质数 
        if(tmp<=n && !vis[tmp]){
            flag = true;
            cout<<prime[i]<<" "<<tmp<<endl;
        }
    }
    if(!flag) cout<<"empty"<<endl;
    return 0;
} 


MT2215 小码哥的喜欢数

难度:钻石    时间限制:1秒    占用内存:128M
题目描述

小码哥不喜欢以下情况的数:

  1. 是7的倍数(包括7);
  2. 数字的某一位是7,这种数字的倍数,小码哥也不喜欢。

小码哥会给你 t t t个数,对其中每个数,如果这个数是他喜欢的数,就告诉他下一个他喜欢的数是多少(即大于这个数的下一个他喜欢的数)。如果这个数他不喜欢,那你要告诉他。

格式

输入格式:第一行,一个正整数 T T T 表示小码哥接下来要给你的数的总量;
     接下来 T T T 行,每行一个整数 x x x,表示这一次小码哥给的数。
输出格式:输出共 T T T 行,每行一个整数。如果这个数是他喜欢的数,那么告诉他下一个他喜欢的数是多少(即大于这个数的下一个他喜欢的数);
     如果这个数他不喜欢,那你要输出 -1
     注:定义 0 不为小码哥喜欢的数。

样例 1

输入:
4
6
33
69
300

输出:
8
36
80
-1

备注

其中: 1 ≤ T ≤ 2 × 10 5 ,   0 ≤ x ≤ 10 7 1\le T\le{2\times10}^5,\ 0\le x\le{10}^7 1T2×105, 0x107


相关知识点:筛法


题解


小码哥不喜欢含有数字 7 的数(以及这些数的倍数)。对于数字是否含有 7,可通过循环取余的方式得到。对于这些数的倍数,则可通过类似于埃氏筛法的方式进行筛选。对于 “下一个他喜欢的数”,可通过在筛选数的过程中,构建一个 next 数组来完成(即每次都将一个小码哥喜欢的数作为索引,保存找到的下一个他喜欢的数)。

下面直接给出基于以上思路得到的完整代码:

/*
	MT2215 小码哥的喜欢数 
*/
#include<bits/stdc++.h> 
using namespace std;

const int MAX = 1e7+5;
// nxt 数组既充当了 vis 数组的作用,也用于保存“下一个数”的位置 
int nums[MAX], nxt[MAX]; 

// 判断一个数是否含有数字 7 
bool isContained(int n)
{
	while(n){
		if(n % 10 == 7)
			return true;
		n /= 10;
	}
	return false;
} 

// 通过筛法求出所有小码哥喜欢的数
void getNums(int n)
{
	// 初始化第一个小码哥喜欢的数(用于构建next数组) 
	int cur = 1, cnt = 0;
	// 从 2 开始向后枚举 
	for(int i=2; i<=n; i++){
		// 果当前数未被访问,则执行进一步判断 
		if(nxt[i] == 0){
			// 如果这个数不包含 7 ,则其为一个小码哥喜欢的数
			if(!isContained(i)){
				// 记录当前数 
				nums[cnt++] = i;
				// 将当前数作为前一个数的下一个数
				nxt[cur] = i;
				// 更新记录“下一个数”的指针
				cur = i;
			}
			// 否则将这个数的所有倍数标记为小码哥不喜欢的数 
			else{
				for(int j=i; j<=n; j+=i) 
					nxt[j] = -1;
			} 
		}
	}
	// 注:0 也是小码哥不喜欢的数
	nxt[0] = -1; 
}

int main( )
{
	// 提前打表获取小码哥喜欢的数
	getNums(MAX-1);
	// 获取输入 
	int T, n; cin>>T;
	while(T--){
		cin>>n;
		cout<<nxt[n]<<endl;
	}
    return 0;
} 


MT2216 数的自我

难度:钻石    时间限制:0.75秒    占用内存:128M
题目描述

提瓦特大陆上有一个贫穷的占星术士小码哥,出于占星术的要求,他时常要解决一些困难的数学问题。这天,上天给了他一个启示:有一类称作 Self-Numbers 的数。对于每一个正整数 n n n,我们定义 d ( n ) d\left(n\right) d(n) n n n 加上它每一位数字的和。例如, d ( 75 ) = 75 + 7 + 5 = 87 d\left(75\right)=75+7+5=87 d(75)=75+7+5=87。给定任意正整数 n n n 作为一个起点,都能构造出一个无限递增的序列: n ,   d ( n ) ,   d ( d ( n ) ) ,   d ( d ( d ( n ) ) ) , … n,\ d\left(n\right),\ d\left(d\left(n\right)\right),\ d\left(d\left(d\left(n\right)\right)\right),\ldots n, d(n), d(d(n)), d(d(d(n))), 例如,如果你从 33 开始,下一个数是 33+33=39,再下一个为 39+3+9=51,再再下一个为 51+5+1=57,因此你所产生的序列就像这样: 33,39,51,57,69,84,96,111,114,120,123,129,141……数字 n n n 被称作 d ( n ) d\left(n\right) d(n) 的发生器。在上面的这个序列中,33 是 39 的发生器,39 是 51 的发生器,51 是 57 的发生器等等。有一些数有超过一个发生器,如 101 的发生器可以是 91 和 100。一个没有发生器的数被称作 Self-Number。如前 13 个 Self-Number 为 1,3,5,7,9,20,31,42,53,64,75,86,97。我们将第 i i i 个 Self-Number 表示为 a [ i ] a\left[i\right] a[i],所以 a [ 1 ] = 1 ,   a [ 2 ] = 3 ,   a [ 3 ] = 5 , … a\left[1\right]=1,\ a\left[2\right]=3,\ a\left[3\right]=5,\ldots a[1]=1, a[2]=3, a[3]=5,

现在小码哥需要找到一个 [ 1 , N ] \left[1,N\right] [1,N] 的区间内所有的 Self-Number,请你帮帮他。

格式

输入格式:第一行输入以空格隔开的两个整数 N N N K K K
     第二行输入 K K K 个以空格隔开的整数 s 1 ,   s 2 ,   s 3 , … , s k s_1,\ s_2,\ s_3,\ldots,s_k s1, s2, s3,,sk

输出格式:第一行你需要输出一个数,这个数表示在闭区间 [ 1 , N ] \left[1,N\right] [1,N] 中 Self-Number 的数量;
     第二行必须包含以空格分隔的 K K K 个数,表示 a [ s 1 ] , … , a [ s k ] a\left[s_1\right],\ldots,a\left[s_k\right] a[s1],,a[sk],这里保证所有的 a [ s i ] a\left[s_i\right] a[si] 都小于$ N$。
     (例如,如果 N = 100 , s k N=100,s_k N=100sk 可以为 1~13,但不能为 14,因为 a [ 14 ] = 108 > 100 a\left[14\right]=108>100 a[14]=108>100)。

样例 1

输入:

100 10
1 2 3 4 5 6 7 11 12 13

输出:

13
1 3 5 7 9 20 31 75 86 97

备注

其中: 1 ≤ N ≤ 10 7 ,   1 ≤ K ≤ 5000 1\le N\le{10}^7,\ 1\le K\le5000 1N107, 1K5000


相关知识点:筛法


题解


根据题目的意思可知,函数 d ( n ) d\left(n\right) d(n) 产生的结果总满足 d ( n ) ≥ n d\left(n\right)\geq n d(n)n 。因此,要找出所有的 SelfNumber,可通过和筛法一样的思路:即根据数字大小枚举每个数,那些尚未被访问的数显然都是 SelfNumber,而通过这些数求出的 d ( n ) d\left(n\right) d(n) 则需要被标记为已被访问(即不是 SelfNumber)。最终扫描结束时,所有标记为未被访问的,就是题目所说的 SelfNumber。

基于这样的思路,可写出求解本题的完整代码:

/*
    MT2216 数的自我  
*/
#include<bits/stdc++.h> 
using namespace std;

const int MAX = 1e7+5;
bool vis[MAX];
int selfNumbers[MAX], cnt; 

// 函数D(n) 
int D(int n)
{
    int ans = n;
    while(n){
        ans += n%10;
        n /= 10;
    }
    return ans;
} 

// 通过筛法求出 selfNumber
int getSelfNumbers(int n)
{
    int Dn;
    for(int i=1; i<=n; i++){
        Dn = D(i);
        if(Dn <= n) vis[Dn] = true;
        if(!vis[i]) selfNumbers[cnt++] = i;
    }
    return cnt;
}

int main()
{
    // 获取输入
    int n, k; cin>>n>>k;
    // 输出 selfNumber 的数量 
    cout<<getSelfNumbers(n)<<endl;
    // 输出对应的 selfNumber
    while(k--){
        cin>>n;
        cout<<selfNumbers[n-1]<<" ";
    }
    return 0;
} 


MT2217 数字游戏

难度:黄金    时间限制:1秒    占用内存:128M
题目描述

小码哥和小码妹正在玩一个小游戏,小码哥先展示一个正整数 n n n,如果小码妹可以写出 k k k 个正整数 x 1 , … , x k x_1,\ldots,x_k x1,,xk。满足 ∏ i = 1 k ( x i + 1 ) \prod_{i=1}^{k}\left(x_i+1\right) i=1k(xi+1),则她可以得到 k k k 分。小码妹的数学并不好,所以请你写一个程序帮忙计算她最多可以得到多少分。

格式

输入格式:一行一个正整数 n ∈ [ 2 , 1 × 10 8 ] n\in\left[2,1\times{10}^8\right] n[2,1×108]
输出格式:一行一个正整数。

样例 1

输入:
12

输出:

3


相关知识点:分解质因数


题解


注意到题目给出的要求是 n = ∏ i = 1 k ( x i + 1 ) n=\prod_{i=1}^{k}\left(x_i+1\right) n=i=1k(xi+1) ,而 x i x_i xi 为正整数,因此这就等价于要求等式右侧各项的最低值为 2。我们知道,任何一个数都可以表达为若干个数相乘的形式,例如:

24 = 2 3 × 3 1 24=2^3\times3^1 24=23×31

所以对 24 而言,它有 8×3、2×2×6、2×2×2×3 等乘积形式。而本题的要求是,对任意给定数,让你求出其最长的乘积形式(该长度即为本题要求的得分)。例如对 24 而言,其最大得分为 4,即 24=2×2×2×3。实际上,我们要做的就是分解质因数。因为要让等式的长度最长,其中的各乘数就应该尽可能小,而最小的因数,当然就是质因数。

前面已经说过如何求一个数的质因数(短除法求一个数的质因数),在此就不再赘述,下面直接给出求解本题的完整代码:

/*
    MT2217 数字游戏 
    要想得分最大,那叠乘的各项应尽可能小,其实就是要算质因数 
*/
#include<bits/stdc++.h> 
using namespace std; 

// 通过短除法获取一个数的质因数个数 
int getPrimeFactors(int n){
    int ans = 0;
    for(int i=2; i*i<=n; i++){
        // 当前数为数 n 的因数时,要不断用该数进行分解 
        while(n%i==0){
			// 统计个数
            ans++;
            n /= i; 
        }
    }
    // 如果分解得到的最后结果不为 1 ,则最终状态的 n 也是原数的因数
    if(n!=1) ans++;
    return ans;
}

int main()
{
    // 获取输入
    int n; cin>>n;
    // 输出最大得分 
    cout<<getPrimeFactors(n)<<endl;
    return 0;
} 

END


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1031449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【word技巧】如何限制word页眉,不被他人修改

我们设置了页眉内容之后&#xff0c;不想其他人修改自己的页眉内容&#xff0c;我们可以设置加密的&#xff0c;设置方法如下&#xff1a; 先将页眉设置好&#xff0c;退出页眉设置之后&#xff0c;我们选择布局功能&#xff0c;点击分隔符 – 连续 设置完之后页面分为上下两节…

基于vue3 的 Echarts图表展示(任务一:用柱状图展示消费额最高的省份)(操作全流程)(图文版)

目录 前言&#xff1a; 操作要求&#xff1a; 操作流程&#xff1a; 一.创建vue项目 1.在vscode上创建vue脚手架工程 二.配置运行环境 2.配置axios(用于访问接口) 和引入echarts包 3.引入需要用到的js包 三.开始实践做题(最后附有完整代码) 1.获取接口数据 2.数据处理 …

博格华纳高压发卡式电机解析

博格华纳的高压发卡式电机具有功率强大、坚固耐用和高性能等特点&#xff0c;采用紧凑型设计&#xff0c;优化的导体绕组结构缩短了电机的尺寸&#xff0c;使其便于在更小的空间内进行安装&#xff0c;并提高了常用区间的工作效率。此外&#xff0c;电机在设计上减少了重稀土元…

Spring Cloud Alibaba Nacos 2.2.3 (4) - 本地源码编译 调试

下载nacos nacos在GitHub上有下载地址&#xff1a;https://github.com/alibaba/nacos/releases&#xff0c;可以选择任意版本下载。 我下载的是2.2.3 版本 导入idea mvn 安装包 1&#xff0c;切换到Terminal ,并且使用command prompt模式 2&#xff0c;执行 mvn -Prelease…

Delaunay三角剖分算法

目录 一. 简介1.1 三角剖分1.2 Delaunay三角剖分 二. Delaunay三角剖分的相关理论2.1 Delaunay三角形和&#xff08;局部&#xff09;Delaunay边的概念2.2 Delaunay引理2.3 翻转边算法&#xff08;flip algorithm&#xff09;2.4 Delaunay三角剖分的最优性质 三. Delaunay三角剖…

缺口的大利润!伦敦银如何使用缺口交易

在伦敦银市场中&#xff0c;我们经常能够看见市场跳空形成缺口&#xff0c;其实&#xff0c;如果利用得当&#xff0c;我们在伦敦银投之中&#xff0c;这些缺口是能够为我们创造盈利机会的&#xff0c;那么下面我们就来讨论一下在伦敦银投之中如何认识这些跳空缺口&#xff0c;…

哪些远程桌面软件适合与团队共享屏幕和文件

远程桌面软件是一种方便团队协作和共享工作的工具。它们能够允许用户通过互联网连接到其他计算机&#xff0c;实现远程访问、共享屏幕和文件、以及协同工作。以下是一些适合与团队共享屏幕和文件的常用远程桌面软件。 1、RayLink RayLink是一款功能强大且易于使用的远程桌面软…

企业微信 API 接口调用教程:图文详解企业微信 API 的使用方法

本文通过 access_token 凭证的方式来讲解怎么调用 企业微信 API&#xff0c;并一步步介绍如何获取企业微信 API 的 corpsecret、corpid、access_token 凭证以及怎么向企业微信的应用发送消息。 企业微信 API 在线地址为&#xff1a;概述 - 企业微信 API &#xff0c;这个在线地…

大型架构设计的演进之路

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 今天我们一起看看大型互联网系统架构的演进之路&#xff0c;主要包含三部分内容。 第一部分是大型互联网系统的特点&#xff0c;分析大型互联网有哪些特点和挑战&#xff0c;它们是现在一些技术和架构方案产生的原因。…

性能测试 —— 性能测试常见的测试指标 !

一、什么是性能测试 先看下百度百科对它的定义&#xff0c;性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 我们可以认为性能测试是&#xff1a;通过在测试环境下对系统或构件的性能进行探测&#xff0c;用以验证在生产环…

网站有反爬机制就爬不了数据?那是你不会【反】反爬

目录 前言 一、什么是代理IP 二、使用代理IP反反爬 1.获取代理IP 2.设置代理IP 3.验证代理IP 4.设置代理池 5.定时更新代理IP 三、反反爬案例 1.分析目标网站 2.爬取目标网站 四、总结 前言 爬虫技术的不断发展&#xff0c;使得许多网站都采取了反爬机制&#xff…

SSL证书如何做到保障网站安全?

当网站显示不安全时&#xff0c;用户会在头脑中产生该网站是否合法的疑问&#xff0c;如果是购物网站或者购物商城&#xff0c;那意味着可能会损失大部分的用户。而SSL证书能有效保障网站的安全性&#xff0c;轻松解决网站不被用户信任的问题。那么&#xff0c;SSL证书究竟是如…

社交媒体商业禁令冲击:TikTok如何应对印尼政策变化?

随着社交媒体的普及和发展&#xff0c;各国政府开始越来越关注这一领域的监管和控制。印尼政府最近的决定&#xff0c;禁止在社交媒体上进行商品交易&#xff0c;引起了广泛的关注。 这一政策变化对TikTok等社交媒体平台带来了巨大的挑战&#xff0c;要求它们重新审视商业模式…

小米云原生文件存储平台化实践:支撑 AI 训练、大模型、容器平台多项业务

小米作为全球知名的科技巨头公司&#xff0c;已经在数百款产品中广泛应用了 AI 技术&#xff0c;这些产品包括手机、电视、智能音箱、儿童手表和翻译机等。这些 AI 应用主要都是通过小米的深度学习训练平台完成的。 在训练平台的存储方案中&#xff0c;小米曾尝试了多种不同的…

按照经纬度进行天气下载

https://power.larc.nasa.gov/data-access-viewer/ 点击data access viewer classic

数据工程中的单元测试完全指南

在数据工程领域中&#xff0c;经常被忽视的一项实践是单元测试。许多人可能认为单元测试仅仅是一种软件开发方法论&#xff0c;但事实远非如此。随着我们努力构建稳健、无错误的数据流水线和SQL数据模型&#xff0c;单元测试在数据工程中的价值变得越来越清晰。 本文带你深入探…

安卓桌面记事本便签软件哪个好用?

日常生活及工作中&#xff0c;很多人常常会遇到一些一闪而现的灵感&#xff0c;这时候拿出手机想要记录时&#xff0c;却找不到记录的软件。在这个快节奏的时代&#xff0c;安卓手机是我们日常生活不可或缺的伙伴。然而&#xff0c;正因为我们的生活如此忙碌&#xff0c;记事变…

从 Hackathon 战队到创业公司,和开发者们聊聊真实世界 AI Apps 的基础设施丨活动预告

在不久前结束的 TiDB Future App Hackath on 2023 上&#xff0c;来自全球 88 个国家的 1492 名参赛者们借助 AI 和 TiDB Serverless 的能力&#xff0c;构建了许多令人印象深刻的项目。 打造 Hackathon 的项目是一个从 0-1 的过程&#xff0c;真实世界中也涌现出了一批创业公…

Java 21正式发布了,来来来,一睹它的芳容!

Oracle 高兴地宣布 JDK 21 已经正式上线了。这是按照每六个月一次的发布计划,准时推出的第 12 个版本。这种定期的发布模式为开发者提供了稳定和可预见的创新,使得他们可以轻松地接纳和采用这些新特性。 Java 由于其出色的性能、稳定性和安全性使其持续成为全球最受欢迎的编程…

启山智软/微信小程序商城源码(微信小程序)

文章目录 启山智软一、小程序商城首页二、小程序商城分类三、小程序商城我的源码获取 启山智软 想要了解代码规范&#xff0c;学习商城解决方案&#xff0c;点击下方官网链接联系客服 作者&#xff1a;启山智软 官网及博客&#xff1a;启山智软官网、CSDN、掘金、gitee 简介&a…