找素数
埃氏筛法
埃氏筛法的基本思想 :从2开始,将每个质数的倍数都标记成合数,以达到筛选素数的目的。
操作:先把所有整数列出来,然后把2的倍数全部剔除,然后是三的,以此类推,遍历所有素数,把倍数全部划去。
对于每个数字i,如果没被划去,他一定是素数,因为他不是任何2到i-1数字的倍数。然后就开始划它的倍数就好。
参考博客 素数基本(埃氏筛法/线性筛法)_兔老大RabbitMQ的博客-CSDN博客_埃氏筛法
代码实现:
-
int visit[max]; void Prime(){ mem(visit,0); //初始化都是素数 visit[0] = visit[1] = 1; //0 和 1不是素数 for (int i = 2; i <= max; i++) { if (!visit[i]) { //如果i是素数,让i的所有倍数都不是素数 for (int j = i*i; j <= max; j += i) { visit[j] = 1; //提剔除素数倍数的数字 } } }
欧拉筛法
欧拉筛法的基本思想 :在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的
代码实现:
-
int prime[maxn]; int visit[maxn]; void Prime(){ mem(visit,0); mem(prime, 0); for (int i = 2;i <= maxn; i++) { cout<<" i = "<<i<<endl; if (!visit[i]) { prime[++prime[0]] = i; //纪录素数, 这个prime[0] 相当于 cnt,用来计数 } for (int j = 1; j <=prime[0] && i*prime[j] <= maxn; j++) { // cout<<" j = "<<j<<" prime["<<j<<"]"<<" = "<<prime[j]<<" i*prime[j] = "<<i*prime[j]<<endl; visit[i*prime[j]] = 1; if (i % prime[j] == 0) { break; } } } }
对于visit[i*prime[j]] = 1 的解释: 这里不是用i的倍数来消去合数,而是把 prime里面纪录的素数,升序来当做要消去合数的最小素因子。
幸运数
基本思想:将数组不断的更新放入vector中,直到数组符合要求。
核心代码:
do // do while循环
{
old.push_back(0);//与前面a相对应
if (start > a.size()-1)//判断是否越界 start小于a中的元素个数
break; //跳出循环
k = a[start++];
if (k > a.size())
break;
for (i = 1; i < a.size(); i++)
{
if (i % k) //if ( k%i != 0)
old.push_back(a[i]); //保留的数放入old容器中
}
a.clear();//将a容器里面清空
a.assign(old.begin(), old.end());//将old容器中的值赋到a容器中
old.clear(); //清空old 准备进入下一次循环
} while (true);
知识点
利用C++中的vector函数,存储数组
定义:vector <int>a(10);
在a的最后一个向量后插入一个元素,其值为5
a.push_back(5);
清空a中的元素
a.clear();
子集选取
long long C(long long m,long long n){
if(!m||m==n) return 1;
if(m>n) return 0;
if(m<mod&&n<=mod)
return ((long long)((long long)(jc[n]*inv[m])%mod)*inv[n-m])%mod;
return ((long long)C(m%mod,n%mod)*C(m/mod,n/mod))%mod;
}
P1003
基本思想:先将字符串中的字母进行排序,然后再进行比较。
核心代码:
public static String f(String str1, String[] s1) {
for (String string : s1) { // 遍历 s1
char[] n = str1.toCharArray(); // 强转字符数组
char[] m = string.toCharArray();
Arrays.sort(n); // 排序
Arrays.sort(m);
if (new String(n).equals(new String(m))) { // 一 一 比 较
return string; // 返回
}
}
return ""; // 空串
}
}